如何在Rust中获取绝对值?

95

这些文档没有什么用:http://web.mit.edu/rust-lang_v0.9/doc/std/num/fn.abs.html

显然,我可以看到这个函数,但我不知道如何调用它。

编辑:

问题在于它不能工作。 :)

use std::num;
let x = num::abs(value);

"未解决的名称:num::abs"

编辑2: 运行昨天的夜间版本(2014年11月26日); 我不知道是哪个版本。我没有意识到那些文档已经过时了。oO

当前的文档似乎表明不存在这样的函数?


我还没有接触过 Rust,但 std::num::abs 看起来是适当的调用。 - user2485710
是的,我也是这么想的。 - user1949917
有什么问题?请展示你的代码。 - user2485710
这些文档是针对非常旧的 Rust 版本 0.9 的(很不幸,我们一直无法联系到放置它们的人,以尝试将它们降级为搜索结果)。http://doc.rust-lang.org/std 是查找有关夜间版本标准库文档的最佳位置(还有内置搜索功能)。您使用的 Rust 版本是什么?(rustc -v - huon
6个回答

150

1
@user2485710:你是什么意思,'“全局”abs函数'?这种东西已经不存在了。std::num::abs不存在。 - Chris Morgan
嗯,http://play.rust-lang.org/ 提供了最新的Rust编程语言实现,而且它非常好用。 - user2485710
1
@user2485710:play.rust-lang.org今天已经过时三周了。 - Chris Morgan
@user2485710 是的,变化总是会发生的,恰好这个变化发生在过去的三周内。很明显这个函数并不存在,否则就不会出现未解决的名称错误,并且也不需要提出这个问题了。你也可以使用搜索来确认 - huon
这个从std改成了core,int现在已经消失了。更新的答案:http://is.gd/B3A6EP - scape
显示剩余3条评论

16

提到std::num::abs的回答已经不再适用。

相反,使用以下内容:

i32::abs(n)

另一个回答更加普适,虽然这个回答也不是错的。 如果要使用另一个回答,您需要知道可以使用类型实例作为第一个参数来调用任何方法,然后您可以在所有上下文中使用该回答。 - BobHy

6
fn main() {
    let mut number: i32 = -8;
    number = number.abs();
    println!("{}", number);
}

请记得您必须显式指定数据类型。


0
为了让abs()正常工作,它应该已经知道值的类型。如果你注意到上面的答案,上下文已经决定了数字的类型。然而,以下方法是行不通的:
println!("{}", (-1).abs());

它会报错:

 can't call method `abs` on ambiguous numeric type

Rust希望在调用类型自己的方法之前确切地知道一个值具有哪种整数类型。在这种情况下,您应该

println!("{}", (-1_i32).abs());
println!("{}", i32::abs(-1));

0
pub fn absolute_value(&self) -> i16 {
i16::abs(self.0) + i16::abs(self.1)
}

-4

这是因为您可能没有提供足够的类型信息。

fn main() {
    println!("Abs is \"{}\"",
              std::num::abs(-42i));
}

注意后缀告诉Rust-42是整数。 < p >一般规则是:无论如何都必须在某处指定类型,而后缀非常方便。例如这种工作的另一种方式是...

fn main() {
    let x = -42i;
    println!("Abs is \"{}\"",
              std::num::abs(x));
}

这也可以工作

fn main() { 
    let x: int = -42;
    println!("Abs is \"{}\"",
              std::num::abs(x));
}

如果你想要一个可变的变量,只需要在 let 后面加上 mut 即可。

fn main() { 
    let mut x: int = -42; 
    x += x;
    println!("Abs is \"{}\"",
              std::num::abs(x));
}

你得到了x,并且可以改变x的值。


这是一种强类型语言。变量具有可能获得的所有类型信息。 - user1949917
1
@archer884 类型推断并不一定与语言的“强类型”或“弱类型”有关,游戏规则只是提供了一个类型,应该是您想要的正确类型。 - user2485710
这是一个变量,不是常量。常量需要你提到的额外类型信息,但我们正在讨论一个变量。在你请求的代码示例中,这一点很清楚。你不能装饰一个变量。你只需在变量名后面添加一个“i”并更改名称即可。这并没有帮助。 - user1949917
@archer884添加了另一个例子,只需要添加一个关键字就可以了。 - user2485710

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接