我正在通读 Rust by Example ,我很好奇为什么我们不能将小数强制转换为 u8
,如以下代码片段所示:
let decimal = 65.4321_f32;
// Error! No implicit conversion
let integer: u8 = decimal;
但是显式转换是允许的,所以我不明白为什么我们不能也隐式转换它。
这是语言设计的决定吗?这有什么好处?
最佳答案
安全是 Rust 及其标准库设计的重要组成部分。很多重点都放在内存安全上,但 Rust 还试图通过强制您做出可能丢失数据或程序可能崩溃的决定来帮助防止常见错误。
一个很好的例子是它使用 Option
输入而不是 null
.如果给你一个Option<T>
你现在被迫决定如何处理它。你可以决定 unwrap
它和 panic ,或者你可以使用 unwrap_or
提供合理的默认值。你的决定,但你必须做出。
转换 f64
到 u8
你可以使用 as
运算符(operator)。它不会自动发生,因为 Rust 无法为您决定在数字太大或太小的情况下您想要发生什么。或者你想用额外的小数部分做些什么?您要将其四舍五入还是四舍五入到最接近的整数?
即使是 as
运算符被一些[1] 认为是早期设计错误,因为您很容易无意中丢失数据 - 特别是当您的代码随着时间的推移而发展并且类型因类型推断而不太可见时。
[1] https://github.com/rust-lang/rfcs/issues/2784#issuecomment-543180066
https://stackoverflow.com/questions/68216696/