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