如果在变量a
上指定了浮点类型,则可以使用abs
函数。以下示例正在运行:
fn main() {
let a = -1.0f64;
println!("{:?}", a.abs());
}
按预期打印1
。但是如果省略f64
,则在编译期间会抛出错误,如下例所示:
fn main() {
let a = -1.0;
println!("{:?}", a.abs());
}
此版本提供以下失败:
Compiling playground v0.1.0 (file:///C:/git/Rust/playground)
src\main.rs:3:24: 3:29 error: no method named `abs` found for type `_` in the current scope
src\main.rs:3 println!("{:?}", a.abs());
^~~~~
note: in expansion of format_args!
<std macros>:2:25: 2:56 note: expansion site
<std macros>:1:1: 2:62 note: in expansion of print!
<std macros>:3:1: 3:54 note: expansion site
<std macros>:1:1: 3:58 note: in expansion of println!
src\main.rs:3:5: 3:31 note: expansion site
src\main.rs:3:24: 3:29 help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
src\main.rs:3:24: 3:29 help: candidate #1: use `core::num::Float`
error: aborting due to previous error
Could not compile `playground`.
To learn more, run the command again with --verbose.
此消息表示a
的类型为_
。我想不能使用abs
函数,因为它不清楚a
的具体类型是什么。这是否意味着在编译时没有定义类型?如果在Rust中没有声明特定的浮点类型,那么使用的是什么类型?
答案 0 :(得分:3)
RFC 212说:
类型不受约束的整数文字将默认为
i32
[...]浮点文字将默认为f64
。
但是,在大多数情况下,某些东西会将推断类型限制为具体类型,例如将其传递给方法或将其放在结构中。
这是否意味着在编译时没有定义类型?
在实际写出代码之前,始终的类型将被定义。然而,整数或浮点字面的具体类型在类型的量子叠加中盘旋,直到某种方式迫使它以某种方式或其他方式。如果没有任何力量,那么它将回落到默认值。
这最终允许这样的代码工作:
use std::{f32, f64};
fn main() {
let a = -1.0;
let b = -1.0;
println!("{:?}", f32::abs(a));
println!("{:?}", f64::abs(b));
}
如果变量是f32
或f64
,可能会发生变化,然后选择一个变量。我不知道编译器内部能够具体回答,但似乎默认类型回退发挥得太晚,无法保存您的代码。当方法查找发生时,它想知道变量的类型以找到有效的匹配,但它还不可用。