考虑以下示例:

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);
}

编译器是否实现了&i32i32之间的操作?
如果是,如何用这种类型安全的语言来证明此操作的合理性?

最佳答案



是的。好吧,不是编译器,而是标准库。您可以看到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/

10-11 13:06