我有一个 &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偏移量位于多字节字符的中间时)。