fn main() { let s = String::from("hello"); let hello = &s[5..]; println!("{}", hello); }
为什么这段代码没有恐慌?我认为这是索引超出内容大小的条件 . 此代码示例的输出不显示任何内容 .
Rust中的范围不包括上限(除非您使用 ..= 范围构造函数) . 这意味着像 2..2 这样的范围是零长度:"start at 2 and take each element up to, but not including 2" . 当长度为 5 时, 5..5 和 5.. 是等效的 .
..=
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 = ""
如果你必须分别处理最后一个空切片,那将会很烦人 .
但是进一步超过数据长度会引起恐慌 . 当字符串的长度为5时,没有理由你故意编写 s[6..6] .
s[6..6]
1 回答
Rust中的范围不包括上限(除非您使用
..=
范围构造函数) . 这意味着像2..2
这样的范围是零长度:"start at 2 and take each element up to, but not including 2" . 当长度为5
时,5..5
和5..
是等效的 .虽然在最后一个元素之后开始一个范围似乎没有多大意义,但这很方便 . 例如,如果您正在缩小范围:
输出:
如果你必须分别处理最后一个空切片,那将会很烦人 .
但是进一步超过数据长度会引起恐慌 . 当字符串的长度为5时,没有理由你故意编写
s[6..6]
.