fn main() {
let a = [1, 2, 3];
println!("{:?}", a[4]);
}
error: this operation will panic at runtime
--> src/main.rs:3:22
|
3 | println!("{:?}", a[4]);
| ^^^^ index out of bounds: the length is 3 but the index is 4
|
= note: `#[deny(unconditional_panic)]` on by default
4条答案
按热度按时间u1ehiz5o1#
如果你想通过索引检查访问
Vec
的元素,你可以把Vec
作为一个切片,然后使用它的get
方法。这将输出:
um6iljoc2#
为了理解这个问题,您必须从编译器看到的Angular 来考虑它。
通常情况下,编译器从不考虑表达式的 value,而只考虑它的 type。
a
的类型为Vec<i32>
4
是未知的整数类型Vec<i32>
实现下标,因此a[4]
进行类型检查让编译器对 values 进行推理并不是未知的,并且有各种各样的方法来获得它。
constexpr
)Rust目前并不支持其中任何一个,虽然对前两个有兴趣,但在1.0之前肯定不会这样做。
因此,在运行时检查这些值,并且
Vec
的实现正确地退出(这里是失败的)。5cg8jx4n3#
请注意,以下是编译时错误:
这是因为如果没有
vec!
,类型就是[i32; 3]
,它实际上携带长度信息。对于
vec!
,它现在是Vec<i32>
类型,不再携带长度信息,它的长度只有在运行时才知道。hc8w905p4#
也许你的意思是:
这将返回一个
Option
,因此它将返回Some
或None
。这是通过引用访问的,因此它直接访问
address
,并导致程序死机。