我正在学习Rust,我在try 举例时遇到了这样的情况:

fn main() {

    let x: &str = "hello";  // We created a string slice, `&str`
    let y: &str = x[2..4];  // I was expecting `y` to be `&str` as well
    // let y: str = x[2..4];  // `y` is actually a str (DST)!
    
    let z: &str = &x[2..4];  // This gives me what I expected!

    println!("str value: {}", z);
}

首先,我相当困惑[编辑];x不是已经是一小块了吗?为什么我需要在最后一条语句中再次附加与号,以使z成为字符串片(在脑海中它看起来像&(&x)&&x)?

推荐答案

我一开始就有点目瞪口呆;x不是已经是一片了吗?

是?

为什么我需要在最后一条语句中再次附加与号,以使z成为字符串片?

因为that's how indexing is defined in the language.

container[index]实际上是*container.index(index)[..]的句法糖分.如果值的类型实现了Copy,这就允许出现let value = v[index]这样的好东西.

这就是为什么您必须重新引用索引操作所拥有的类型或DST.

Rust相关问答推荐

常量泛型和类型枚举箱有重叠的用途吗?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

铁 rust 中的共享对象实现特征

如何正确地将App handler传递给Tauri中的其他模块?

获取与父字符串相关的&;str的原始片段

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

tokio::sync::broadcast::Receiver 不是克隆

结果流到 Vec 的结果:如何避免多个into_iter和collect?

如何从trait方法返回std :: iter :: Map?

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

Rust 打包在 .deb 中

Rust 中的生命周期:borrow 的 mut 数据

有没有办法通过命令获取 Rust crate 的可安装版本列表?

了解 Rust 闭包:为什么它们持续持有可变引用?

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

使用 HashMap 条目时如何避免字符串键的短暂克隆?

如何使用 rust bindgen 生成的 std_vector

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?