为什么.parse()将"42"转换为f64但是将"42.0"转换为i32失败?

Gre*_*reg 4 rust

该行的原因和方式如何:

let guess: f64 = "42".parse().expect("Not a number!");
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

let guess: i32 = "42.0".parse().expect("Not a number!");
Run Code Online (Sandbox Code Playgroud)

导致:

thread 'main' panicked at 'Not a number!: ParseIntError { kind: InvalidDigit }'
Run Code Online (Sandbox Code Playgroud)

将"float"和str解析为整数的正确方法是什么?

更新:

我发现这个工作:

let guess: i32 = "42.0".parse::<f64>().expect("Not a number!") as i32;
Run Code Online (Sandbox Code Playgroud)

但是我不明白它是如何工作的机制以及它是否是正确的方法呢?

Sir*_*ius 6

你究竟在呼唤什么let guess: i32 = "42.0".parse::<i32>();.

但是,"42.0"不是一个正确的表示i32.

根据文件:

因为它parse是如此通用,它可能导致类型推断的问题.因此,parse是几次你会看到亲切地称为"turbofish"语法之一:::<>.这有助于推理算法明确了解您尝试解析的类型.

您已经找到的正确解决方案确实是在解析器中提示字符串是float的表示形式:

"42.0".parse::<f64>()
Run Code Online (Sandbox Code Playgroud)

  • @Jmb这就是为什么OP应该使用`trunc`,`ceil`或`floor`来明确表达他们的意图,而不是依赖于默认行为(目前相当于trunc,请参阅https://stackoverflow.com/a /37508518/393701)。 (2认同)