什么是默认的浮点类型?

时间:2015-09-21 14:32:35

标签: floating-point rust

如果在变量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中没有声明特定的浮点类型,那么使用的是什么类型?

1 个答案:

答案 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));
}

如果变量是f32f64,可能会发生变化,然后选择一个变量。我不知道编译器内部能够具体回答,但似乎默认类型回退发挥得太晚,无法保存您的代码。当方法查找发生时,它想知道变量的类型以找到有效的匹配,但它还不可用。