string - 如何更新字符串中的字符?

标签 string rust

<分区>

我正在尝试更新 charString ,但似乎无法做到这一点。

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);
}

关于string - 如何更新字符串中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47132141/

相关文章:

python/objective-c utf8 比较不同

python - 如何使用缓冲区迭代字符串(python)

java - 按特定顺序替换字符串中的字符

c++ - 如何根据位置(偶数或奇数)将一个 full=number 分成两组

python - 为什么 ANSI 转义码有时可以在 CMD 中工作

java - 为什么这个分隔符没有发挥应有的作用?

rust - 在actix线程中进行同步http客户端访存

windows - 与构建文件夹外的 Windows 库链接

linux - 在将 'alsa-sys' crate 构建为依赖项时,如何安装和连接 alsa.pc?

file - 如何过滤文件路径然后使用结果路径