Rust 的范围索引行为记录在哪里?

问题描述 投票:0回答:1

在 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]

 行为的地方?具体来说,我觉得文档应该明确说明,如果以下任一情况为真,则会出现恐慌:

  1. range.end > slice.len()
    
    
  2. range.end < range.start
    
    
此外,文档还应该明确指出,这

确实会出现恐慌,而不仅仅是可能,因为这种恐慌肯定不是 UB。

rust indexing range slice panic
1个回答
0
投票
我相信它没有记录切片(欢迎您发送 PR),但至少记录了

str

,在支持索引的特征中:
SliceIndex

恐慌

如果

begin

end
 不指向起始字节偏移量,则会出现恐慌
一个字符(由 
is_char_boundary
 定义),如果 
begin > end
,或者如果
end > len

© www.soinside.com 2019 - 2024. All rights reserved.