syntax - 为什么从字符串长度开始的切片不会 panic ?

标签 syntax rust

fn main() {
    let s = String::from("hello");
    let hello = &s[5..];
    println!("{}", hello);
}

为什么这段代码运行起来没有 panic ?我认为这是索引超出内容大小的情况。此代码示例的输出未显示任何内容。

最佳答案

Rust 中的范围不包括上限(除非您使用 ..= 范围构造函数)。这意味着像 2..2 这样的范围是零长度:“从 2 开始并将每个元素取到,但不包括 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 = ""

如果您必须单独处理最后一个空切片,情况会很烦人。

但是超过数据长度引起 panic 。当字符串的长度为 5 时,您没有理由故意编写 s[6..6]

关于syntax - 为什么从字符串长度开始的切片不会 panic ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52035619/

相关文章:

c - 为什么这段代码不报错?

从 View 搜索时 MySQL 语法错误

generics - 使用宏编写 const 泛型枚举组合

rust - 如何计算函数的输出生命周期?

rust - 将字符串开头字符的多个副本合并为 Rust 中的一个

ruby - 为什么 `a (b.c do;end)` 不是句法正确的 Ruby 程序?

java - 在 Java 中构建字符串的 ArrayList 就像在 Javascript 中一样简单

javascript - node.js 中的编码风格

rust - 有没有一种简单的方法可以将 Rc 的克隆移至关闭状态?

operator-overloading - E0369 连接字符串引用时