面试题答案
一键面试- 索引越界:
- 场景:当使用
[]
操作符访问数组或向量(Vec
)等集合类型超出其有效索引范围时。例如:
let v = vec![1, 2, 3]; let value = v[10]; // 这里索引10超出了向量v的范围
- 原因:Rust旨在保证内存安全,这种越界访问可能导致未定义行为,会破坏内存的一致性,所以
panic!
宏触发,以防止程序继续执行造成更严重后果。
- 场景:当使用
- 解引用空指针:
- 场景:当对一个
Option
类型中为None
的值进行解引用,或者尝试解引用一个原始的空指针(*const T
或*mut T
)时。例如:
let opt: Option<i32> = None; let value = opt.unwrap(); // unwrap方法在值为None时会panic
- 原因:解引用空指针是典型的未定义行为,可能导致程序崩溃或内存损坏,
panic!
宏使程序停止运行避免此类问题。
- 场景:当对一个
- 断言失败:
- 场景:使用
assert!
宏时,如果断言条件为false
。例如:
let x = 5; assert!(x > 10, "x should be greater than 10");
- 原因:
assert!
宏用于验证程序中的假设,当假设不成立时,说明程序逻辑可能存在错误,panic!
宏让程序停止,以便开发者定位和修复问题。
- 场景:使用
- 调用
unwrap
系列方法失败:- 场景:对于
Result
类型,如果调用unwrap
方法,而其内部是Err
值时。例如:
let result: Result<i32, &str> = Err("some error"); let value = result.unwrap(); // 这里会panic
- 原因:
unwrap
方法旨在获取Result
类型中的Ok
值,如果是Err
值,表明操作失败,panic!
宏触发以阻止程序继续使用错误结果进行可能不正确的计算。
- 场景:对于