rust - 为什么 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它和 panic ,或者你可以使用 unwrap_or提供合理的默认值。你的决定,但你必须做出。

转换 f64u8你可以使用 as运算符(operator)。它不会自动发生,因为 Rust 无法为您决定在数字太大或太小的情况下您想要发生什么。或者你想用额外的小数部分做些什么?您要将其四舍五入还是四舍五入到最接近的整数?

即使是 as运算符被一些[1] 认为是早期设计错误,因为您很容易无意中丢失数据 - 特别是当您的代码随着时间的推移而发展并且类型因类型推断而不太可见时。


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

https://stackoverflow.com/questions/68216696/

相关文章:

javascript - Js 文件作为 cypress 中的夹具未加载

postgresql - 为什么我的 PostgreSQL 在 CURRENT_TIMESTAMP

common-lisp - 为什么在这种情况下 find 函数返回 NIL?

arrays - 通过在 c 中迭代打印字符

javascript - 两个 TX 的双哈希

r - 根据列中的值创建新行?

javascript - 使用 react-hook-form 重置功能时,Material-UI

python - Jinja2模板,去掉回车

html - Bootstrap 警报按钮设计已关闭,单击时不会关闭

r - 从向量中提取重复 n 次的元素 (R)