首页 > 解决方案 > 字符串切片与切片&字符串

问题描述

我正在阅读 rust lang 网站上的文档,在第 4 章中,他们做了以下示例:

let s = String::from("hello world");

let hello = &s[0..5];
let world = &s[6..11];

hello&str我从 type 的变量创建s的类型String

下面的一些行定义了以下函数:

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}

这次s是类型&String,但仍然&s[0..i]给了我&str一片。这怎么可能?我认为实现这一目标的正确方法是&((*str)[0..i]).

我错过了什么吗?也许在[0..i]操作期间 Rust自动尊重变量?

谢谢

标签: rustslice

解决方案


也许在[0..i]操作期间 Rust自动尊重变量?

这正是发生的事情。当您调用方法/索引引用时,它会在应用该方法之前自动取消引用。此行为也可以使用Dereftrait 手动实现。以 为目标实现String,这意味着当您在 上调用方法时。在此处阅读有关 deref 强制的更多信息。DerefstrstrString


推荐阅读