我正在尝试更新 char
在String
,但似乎无法做到这一点。
fn main() {
let mut s = "poyo".to_string();
// s[1] = 'i'; or s.get_mut(1) = 'i'; can't do either
println!("{}", s); // expecting "piyo"
}
我知道为什么会这样( String
没有实现 IndexMut<usize>
),但我不知道如何解决这个...
playground link
答案取决于 String
的类型你正在处理;如果您正在使用 ASCII only(这意味着每个字符的大小都是一个字节,您可以直接操作底层 Vec<u8>
),您可以执行以下操作:
fn main() {
let mut s = "poyo".to_string();
let mut bytes = s.into_bytes();
bytes[1] = 'i' as u8;
unsafe { s = String::from_utf8_unchecked(bytes) }
println!("{}", s);
}
或:
fn main() {
let mut s = "poyo".to_string();
unsafe {
let bytes = s.as_bytes_mut();
bytes[1] = 'i' as u8;
}
println!("{}", s);
}
但是,如果您(可能)使用多字节字符(这就是 String
没有实现 IndexMut
甚至 Index
的全部原因),安全的方法是使用 Chars
迭代器,遍历它并创建一个新的 String
基于其元素:
fn main() {
let s = "poyo".to_string();
let iter = s.chars();
let mut new = String::new();
for (i, mut c) in iter.enumerate() {
if i == 1 { c = 'i'; }
new.push(c);
}
println!("{}", new);
}