给定v = vec![1,2,3,4],为什么v[4..]返回一个空向量,但v[5..]个panic ,而v[4]v[5]个panic ?我怀疑这与没有指定起点或终点的切片实现有关,但我在网上找不到任何相关信息.

推荐答案

这仅仅是因为std::ops::RangeFrom被定义为"包含在下方的有界".

快速回顾一下所有管道:使用4..(解析为std::ops::RangeFrom)作为参数,从v[4..]个desugars到std::ops::Index个desugars.std::ops::RangeFrom实现std::slice::SliceIndexVec对实现std::slice::SliceIndex的任何参数都有implementationstd::ops::Index.所以你现在看到的是一个RangeFrom被用来代替Vec.

std::ops::RangeFrom定义为始终包含在下限上.例如,[0..]将包括被索引对象的第一个元素.如果(在你的例子中)Vec是空的,那么[0..]将是空的片.注意:如果下限不包括在内,那么就无法在不引起panic 的情况下分割空的Vec,这会很麻烦.

一个简单的思考方式是"篱笆柱放在哪里".

vec![0, 1, 2 ,3]中的v[0..]

|  0    1    2    3   |
  ^
  |- You are slicing from here. This includes the
     entire `Vec` (even if it was empty)

v[4..]年后就是了

|  0    1    2    3   |
                    ^
                    |- You are slicing from here to the end of the Vector.
                       Which results in, well, nothing.

v[5..]就够了

|  0    1    2    3   |
                        ^
                        |- Slicing from here to infinity is definitely
                           outside the `Vec` and, also, the
                           caller's fault, so panic!

v[3..]分是

|  0    1    2    3   |
                ^
                |- slicing from here to the end results in `&[3]`

Rust相关问答推荐

WebDriver等待三十四?(Rust Se)

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

go 掉包装 struct 中的泛型

把Vector3变成Vector4的绝妙方法

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

我如何在Rust中使用传递依赖中的特征?

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

更新 rust ndarray 中矩阵的一行

Button.set_hexpand(false) 不会阻止按钮展开

Rust 打包在 .deb 中

有什么办法可以追踪泛型的单态化过程吗?

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

我什么时候应该使用特征作为 Rust 的类型?

如何在 Rust 中将 bson::Bson 转换为 Vec

在 RefCell 上borrow

如何为返回正确类型的枚举实现 get 方法?

为什么-x试图解析为文字并在声明性宏中失败?

Rust 生命周期:不能在方法内重新borrow 可变字段