如何根据 Rust String 或 &str 类型中的索引删除子字符串?

Aru*_*kal 6 rust

我有一个 &str 类型字符串,我想从中删除子字符串。我有一个算法来计算要删除的部分的开始和结束位置。我现在如何删除子字符串?

为了更清楚地说明这一点,如果我使用 C++,我会这样做:

#include<iostream>
#include<string>

    int main(){
        std::string foo = "Hello";
        int start = 2,stop = 4;
        std::cout<<foo;
        foo.erase(start, stop - start);
        std::cout<<std::endl<<foo<<std::endl;
    }
Run Code Online (Sandbox Code Playgroud)

我的 Rust 代码:

fn main(){
    let mut foo: &str = "hello";
    let start: i32 = 0;
    let stop: i32 = 4;
    //what goes here?
}
     
Run Code Online (Sandbox Code Playgroud)

Kit*_*tsu 10

&str是一个不可变的切片,它有点类似于std::string_view,所以你不能修改它。相反,您可以使用迭代器并收集一个新的String

let removed: String = foo
    .chars()
    .take(start)
    .chain(foo.chars().skip(stop))
    .collect();
Run Code Online (Sandbox Code Playgroud)

另一种方法是就地String修改:

let mut foo: String = "hello".to_string();

// ...

foo.replace_range((start..stop), "");
Run Code Online (Sandbox Code Playgroud)

但请记住,最后一个示例在语义上有所不同,因为它对字节索引而不是字符索引进行操作。因此,它可能会因错误使用而出现恐慌(例如,当start偏移量位于多字节字符的中间时)。

  • “replace_range”方式可能更快。另请注意,使用“chars”时,索引不太可能有用的代码点索引,而使用“replace_range”时,它们是字节索引,因此这两个示例并不完全等效。 (3认同)