首页 文章

为什么从字符串长度开始的切片不会引起恐慌?

提问于
浏览
6
fn main() {
    let s = String::from("hello");
    let hello = &s[5..];
    println!("{}", hello);
}

为什么这段代码没有恐慌?我认为这是索引超出内容大小的条件 . 此代码示例的输出不显示任何内容 .

1 回答

  • 11

    Rust中的范围不包括上限(除非您使用 ..= 范围构造函数) . 这意味着像 2..2 这样的范围是零长度:"start at 2 and take each element up to, but not including 2" . 当长度为 5 时, 5..55.. 是等效的 .

    虽然在最后一个元素之后开始一个范围似乎没有多大意义,但这很方便 . 例如,如果您正在缩小范围:

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

相关问题