用字符串中的其他ASCII字符替换某些ASCII字符的简明而安全的方法

时间:2017-03-28 16:08:02

标签: string rust

我想编写一个带有可变字符串的函数,并检查第一个和最后一个字符是否为"字符。如果是这样,那么这两个字符应该用反引号字符`替换。我已经提出了这个解决方案:

fn replace_wrapping_char(s: &mut String) {
    if s.len() > 1 && s.starts_with('"') && s.ends_with('"') {
        unsafe {
            let v = s.as_mut_vec();
            v[0] = '`' as u8;
            *v.last_mut().unwrap() = '`' as u8;
        }
    }
}

这似乎有用(是的,'`'.is_ascii()返回true),但它使用unsafe 对我来说有点难看。

有没有一种安全,简洁的方法来实现我的目标?

1 个答案:

答案 0 :(得分:1)

这是一个安全,缩短版本的功能,虽然它不会有内存效率。这将创建一个副本并重新分配给定的字符串,因此返回新字符串的纯函数原型可能更适合这里。它还依赖于双引号字符在UTF-8中为1字节大小的事实。

fn replace_wrapping_char(s: &mut String) {
    if s.len() > 1 && s.starts_with('"') && s.ends_with('"') {
        *s = format!("`{}`", &s[1 .. s.len()-1])
    }
}

Playground