提问者:小点点

如何根据索引从Rust字符串或&Str类型中删除子字符串?


我有一个&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;
    }

我的Rust代码:

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

共1个答案

匿名用户

&str是一个不可变的片,它有点类似于std::string_view,所以您不能修改它。 相反,您可以使用iterator并收集新的字符串:

let removed: String = foo
    .chars()
    .take(start)
    .chain(foo.chars().skip(stop))
    .collect();

另一种方式是就地修改string:

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

// ...

foo.replace_range((start..stop), "");

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