【发布时间】:2014-09-13 22:26:01
【问题描述】:
谁能解释一下为什么会这样编译:
fn main() {
let a = vec![1, 2, 3];
println!("{:?}", a[4]);
}
运行它时,我得到:
线程 '' 在 'index out of bounds: the len is 3 but index is 4' 时惊慌失措,../src/libcollections/vec.rs:1132
【问题讨论】:
-
可能与它不会在任何其他语言中引发编译器错误的原因相同;编译器将
4视为一个表达式,它也可能是可能返回其他值的f(x)。 -
是的,但编译器必须看到表达式是常量文字,因此可以在编译期间检查。
-
它可以在将来添加或作为插件添加,但它是一种优化,需要在编译时进行一些评估以了解向量的长度,并通过检查对检索元素的许多方法的调用.
-
我猜编译器根本不知道
Vec<int>是什么,如果你以Vec::new()开头,它的大小是 0 并且如果你调用 push 三次,它的size 变为 3 并且方括号中的索引必须小于向量的大小。Vec只是一个库类型。编译器对此没有特别的了解。 -
编译时错误与您可以轻松证明的程序会在运行时崩溃之间是有区别的。您的程序应该只在运行时正确恐慌,这就是您编写的代码行告诉它要做的事情。也许有人可以在编译器中添加一个 lint 以在执行此操作时发出警告,但就像真的没有任何目的一样,从事编译器工作的人可以更好地把时间花在其他地方。
标签: rust