在 Rust 中,如果您尝试使用“向后”索引切片
Range<usize>
,程序会出现恐慌:
let arr = [0,1,2,3,4,5,6];
let slice = &arr[4..1]; // panic: slice index starts at 4 but ends at 1
这种行为并不令人惊讶,但并不明显:合理的替代行为是仅返回空切片
&[]
。这就是 python 所做的。
Index::index的文档指出索引操作“如果索引越界可能会出现恐慌”,但没有定义“越界”的含义。我认为在这个例子中,对于大小为 7 的数组,范围 4..1
实际上是not 越界,因为 4 和 1 都小于 7,因此这里的恐慌行为是错误的并返回考虑到文档的措辞方式,空切片
&[]
是比恐慌更合理的行为。文档中是否有明确定义
Index<Range<usize>> for [T]
行为的地方?具体来说,我觉得文档应该明确说明,如果以下任一情况为真,则会出现恐慌:
range.end > slice.len()
range.end < range.start
确实会出现恐慌,而不仅仅是可能,因为这种恐慌肯定不是 UB。
str
,在支持索引的特征中:
SliceIndex
:
恐慌如果
begin
或end
不指向起始字节偏移量,则会出现恐慌 一个字符(由is_char_boundary
定义),如果begin > end
,或者如果end > len
。