【问题标题】:In Rust, why doesn't &v[1..] panic when the size of vector v is one? [duplicate]在 Rust 中,当向量 v 的大小为 1 时,为什么 &v[1..] 不会恐慌? [复制]
【发布时间】:2021-09-27 12:30:27
【问题描述】:

Programming Rust, 2nd Edition中的gcd example中,为什么&numbers[1..]不会导致语句出现越界错误

for m in &numbers[1..]

当向量numbers 的大小为1 时? numbers[1] 不是针对第二个元素,即向量末尾之外的一个元素吗?

例如,我预计 gcd 45 会恐慌,但它报告的最大公约数是 45:

ubuntu@development1:~/Documents/projects/rust/programming_in_rust/examples/gcd$ cargo run 45
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/gcd 45`
The greatest common divisor of [45] is 45

【问题讨论】:

    标签: vector rust range slice


    【解决方案1】:

    因为文档是这样说的:

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

    因为在你的情况下 len 是 1 1.. 不会恐慌并返回一个空切片。在您的情况下相当于1..1

    【讨论】:

    • 这是否也意味着&v[0..0]v为空时也不会panic?
    • @DerekMahar “如果 begin 或 end 不指向字符的起始字节偏移量(由 is_char_boundary 定义),如果 begin > end 或 end > len,则会出现恐慌。” doc.rust-lang.org/std/slice/…。所以 &v[0..0],永远不要惊慌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多