为什么Rust中的原始类型之间没有隐式类型转换(强制)

我正在阅读Rust by Example,我很好奇为什么我们不能将小数强制转换为 a u8,如下面的代码片段所示:

let decimal = 65.4321_f32;

// Error! No implicit conversion
let integer: u8 = decimal;

但是允许显式转换,所以我不明白为什么我们也不能隐式转换。

这是语言设计决定吗?这带来什么好处?

回答

安全性是 Rust 及其标准库设计的重要组成部分。很多重点都放在内存安全上,但 Rust 也试图通过强制您做出决定,哪些地方可能会丢失数据,哪些地方可能会导致程序崩溃,从而帮助防止常见错误。

一个很好的例子是它使用Option类型而不是null. 如果你得到一个,Option<T>你现在被迫决定如何处理它。你可以决定unwrap它并恐慌,或者你可以unwrap_or用来提供一个合理的默认值。你的决定,但你必须做出。

要将 a 转换f64为 a,u8您可以使用as运算符。它不会自动发生,因为 Rust 无法为你决定在数字太大或太小的情况下你想要发生什么。或者您想对额外的小数部分做些什么?您想向上或向下取整还是最接近的整数?

甚至as有些人[1]也认为运算符是早期设计错误,因为您很容易无意中丢失数据 - 特别是当您的代码随着时间的推移而演变并且由于类型推断而导致类型不太明显时。


[1] https://github.com/rust-lang/rfcs/issues/2784#issuecomment-543180066


以上是为什么Rust中的原始类型之间没有隐式类型转换(强制)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>