【问题标题】:Why does .parse() convert "42" to f64 but fails convert "42.0" to i32?为什么 .parse() 将“42”转换为 f64 但无法将“42.0”转换为 i32?
【发布时间】:2017-11-08 11:02:22
【问题描述】:

这条线为什么以及如何工作:

let guess: f64 = "42".parse().expect("Not a number!");

但这不是吗?

let guess: i32 = "42.0".parse().expect("Not a number!");

导致:

thread 'main' panicked at 'Not a number!: ParseIntError { kind: InvalidDigit }'

将“float” &str 解析为整数的正确方法是什么?

更新:

我发现这行得通:

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

但是我不明白它的工作原理以及它是否是正确的方法?

【问题讨论】:

    标签: rust


    【解决方案1】:

    你打电话的其实是let guess: i32 = "42.0".parse::&lt;i32&gt;();

    但是,"42.0" 不是 i32 的正确表示。

    根据documentation

    因为parse 太笼统了,可能会导致类型问题 推理。因此,parse 是少数几个您会看到 语法被亲切地称为“turbofish”:::&lt;&gt;。这有助于 推理算法具体了解您正在尝试哪种类型 解析成。

    您已经找到的正确解决方案确实是提示解析器该字符串是浮点数的表示:

    "42.0".parse::<f64>()
    

    【讨论】:

    • 我会注意到,注释左侧的类型通常足以避免使用 turbofish 运算符(并且更简洁)。这里真的是一个边缘情况,想要解析为浮点数并截断数据。
    • 请注意,给定字符串"42.1",建议的解决方案会静默地将其截断为42,这取决于您的应用程序可能需要也可能不需要。在某些情况下,您可能需要在转换之前检查解析的浮点数是否真的代表整数。
    • @Jmb 这就是为什么 OP 应该使用 truncceilfloor 来明确表达他们的意图,而不是依赖于默认行为(目前相当于 trunc,请参阅 @ 987654322@).
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多