考虑这个例子:
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(使用前将#替换为@)