考虑以下示例:
fn main() {
let v: Vec<i32> = vec![1, 2, 3, 4, 5];
let b: i32 = (&v[2]) * 4.0;
println!("product of third value with 4 is {}", b);
}
失败,因为
float
无法与&i32
相乘。error[E0277]: cannot multiply `{float}` to `&i32`
--> src\main.rs:3:23
|
3 | let b: i32 = (&v[2]) * 4.0;
| ^ no implementation for `&i32 * {float}`
|
= help: the trait `std::ops::Mul<{float}>` is not implemented for `&i32`
但是,当我将float更改为int时,它可以正常工作。
fn main() {
let v: Vec<i32> = vec![1, 2, 3, 4, 5];
let b: i32 = (&v[2]) * 4;
println!("product of third value with 4 is {}", b);
}
编译器是否实现了
&i32
和i32
之间的操作?如果是,如何用这种类型安全的语言来证明此操作的合理性?
最佳答案
是的。好吧,不是编译器,而是标准库。您可以看到impl in the documentation。
“类型安全”不是 bool 属性,而是频谱。大多数C++程序员会说C++是类型安全的。但是,C++具有许多可在类型之间自动转换的功能(构造函数,operator T
,采用值的引用等)。在设计编程语言时,必须权衡错误的风险(引入方便的类型转换时)与不便(如果没有缺陷时)。
举一个极端的例子:考虑Option<T>
是否会取消引用T
,如果是None
则会 panic 。这就是大多数具有null
的语言的行为。我认为很明显,这种“功能”导致了现实世界中的许多错误(搜索术语“十亿美元的错误”)。另一方面,让我们考虑编译&i32 * i32
可能导致哪些错误。老实说,我想不出什么。 Maaaybe有人想将一个值的原始指针与整数相乘?在Rust中不太可能。因此,由于引入带有此功能的错误的机会很小,但是很方便,因此决定实现该功能。
这始终是设计师必须平衡的东西。在此频谱上,不同的语言处于不同的位置。 Rust可能被认为比C++更具“类型安全”,但毫无疑问,甚至还有比Rust更“类型安全”的语言。在这种情况下,“更安全的类型”仅表示:决策更倾向于“不便而不是潜在的错误”。
关于rust - rust 如何将i32与&i32相乘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57739755/