Rust 如何将 &i32 与 i32 相乘?

2023-12-29

考虑这个例子:

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 and i32? 如果是,那么在这种类型安全的语言中该操作如何合理?


编译器是否实现了之间的操作&i32 and i32?

是的。嗯,不是编译器,而是标准库。你可以看到实现在文档中 https://doc.rust-lang.org/stable/std/ops/trait.Mul.html#impl-Mul%3C%26%27_%20i32%3E.

如果是,那么在这种类型安全的语言中该操作如何合理?

“类型安全”不是布尔属性,而是一个范围。大多数 C++ 程序员会说 C++ 是类型安全的。然而,C++ 有许多在类型之间自动转换的功能(构造函数、operator T,引用值,...)。在设计一种编程语言时,必须平衡错误的风险(当引入方便的类型转换时)和不便(当没有它们时)。

举一个极端的例子:考虑如果Option<T>会取消引用T如果是的话就会恐慌None。这是大多数语言的行为null。我认为很明显,这个“功能”导致了现实世界中的许多错误(搜索术语“十亿美元的错误”)。另一方面,让我们考虑一下可能会导致哪些错误&i32 * i32编译。老实说我想不出任何办法。Maaaybe有人想将一个值的原始指针与一个整数相乘?在 Rust 中不太可能。所以由于这个功能引入bug的几率很低,而且很方便,所以决定实现。

这始终是设计师必须平衡的事情。不同的语言在此范围内处于不同的位置。 Rust 可能被认为比 C++ “类型更安全”,但毫无疑问,甚至还有比 Rust “类型更安全”的语言。在这种情况下,“类型更安全”只是意味着:决策更倾向于“不便而不是潜在的错误”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 如何将 &i32 与 i32 相乘? 的相关文章

随机推荐