如何从循环中的可变字符串中删除字符?
How do I remove characters from a mutable string within a loop?
我试图在循环中删除可变字符串中的一些字符:
fn main() {
let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
let chars: [char; 5] = ['B', 'A', 'L', 'O', 'N'];
find_balloon(&mut var1, &chars);
}
fn find_balloon<'a>(s: &'a mut String, chars: &'a [char; 5]) {
for (i, p) in s.char_indices() {
if chars.iter().any(|&x| x == p) {
let mut x = s.remove(i);
println!("{}", x);
}
}
}
我得到的错误如下:
error[E0502]: cannot borrow `*s` as mutable because it is also borrowed as immutable
--> src/main.rs:10:25
|
8 | for (i, p) in s.char_indices() {
| ----------------
| |
| immutable borrow occurs here
| immutable borrow later used here
9 | if chars.iter().any(|&x| x == p) {
10 | let mut x = s.remove(i);
| ^^^^^^^^^^^ mutable borrow occurs here
您不能从当前迭代的字符串中删除元素。相反,只需使用迭代器的 filter
方法并收集到一个字符串中:
// using a hashset instead of a slice due to hashsets being faster
// the slice.iter().any approach still works though
use std::collections::HashSet;
fn find_balloon(s: &mut String, chars: &HashSet<char>) {
let filtered: String = s.chars().filter(|x| !chars.contains(x)).collect();
println!("{}", filtered);
}
fn main() {
let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
let chars: [char; 5] = ['B', 'A', 'L', 'O', 'N'];
find_balloon(&mut var1, &chars.iter().cloned().collect());
}
您可以使用 String::retain
方法。它完全符合您的要求,无需额外分配。
fn find_balloon(s: &mut String, chars: &[char; 5]) {
s.retain(|p| if chars.contains(&p) {
false
} else {
print!("{}", p);
true
});
}
fn main() {
let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
let chars: [char; 5] = ['B', 'A', 'L', 'O', 'N' ];
find_balloon(&mut var1, &chars);
}
我试图在循环中删除可变字符串中的一些字符:
fn main() {
let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
let chars: [char; 5] = ['B', 'A', 'L', 'O', 'N'];
find_balloon(&mut var1, &chars);
}
fn find_balloon<'a>(s: &'a mut String, chars: &'a [char; 5]) {
for (i, p) in s.char_indices() {
if chars.iter().any(|&x| x == p) {
let mut x = s.remove(i);
println!("{}", x);
}
}
}
我得到的错误如下:
error[E0502]: cannot borrow `*s` as mutable because it is also borrowed as immutable
--> src/main.rs:10:25
|
8 | for (i, p) in s.char_indices() {
| ----------------
| |
| immutable borrow occurs here
| immutable borrow later used here
9 | if chars.iter().any(|&x| x == p) {
10 | let mut x = s.remove(i);
| ^^^^^^^^^^^ mutable borrow occurs here
您不能从当前迭代的字符串中删除元素。相反,只需使用迭代器的 filter
方法并收集到一个字符串中:
// using a hashset instead of a slice due to hashsets being faster
// the slice.iter().any approach still works though
use std::collections::HashSet;
fn find_balloon(s: &mut String, chars: &HashSet<char>) {
let filtered: String = s.chars().filter(|x| !chars.contains(x)).collect();
println!("{}", filtered);
}
fn main() {
let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
let chars: [char; 5] = ['B', 'A', 'L', 'O', 'N'];
find_balloon(&mut var1, &chars.iter().cloned().collect());
}
您可以使用 String::retain
方法。它完全符合您的要求,无需额外分配。
fn find_balloon(s: &mut String, chars: &[char; 5]) {
s.retain(|p| if chars.contains(&p) {
false
} else {
print!("{}", p);
true
});
}
fn main() {
let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
let chars: [char; 5] = ['B', 'A', 'L', 'O', 'N' ];
find_balloon(&mut var1, &chars);
}