fn main() {
let s = String::from("hello");
let hello = &s[5..];
println!("{}", hello);
}
为什么这段代码运行起来没有 panic ?我认为这是索引超出内容大小的情况。此代码示例的输出未显示任何内容。
最佳答案
Rust 中的范围不包括上限(除非您使用 ..=
范围构造函数)。这意味着像 2..2
这样的范围是零长度:“从 2 开始并将每个元素取到,但不包括 2”。当长度为5
时,5..5
和5..
是等价的。
虽然从最后一个元素开始一个范围似乎没有多大意义,但这样做很方便。例如,如果您采用不断缩小的范围:
for i in 0 .. s.len() + 1 {
println!("slice = {:?}", &s[i ..]);
}
输出:
slice = "hello"
slice = "ello"
slice = "llo"
slice = "lo"
slice = "o"
slice = ""
如果您必须单独处理最后一个空切片,情况会很烦人。
但是超过数据长度会引起 panic 。当字符串的长度为 5 时,您没有理由故意编写 s[6..6]
。
关于syntax - 为什么从字符串长度开始的切片不会 panic ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52035619/