使用std库实现slice_shift_char

时间:2015-07-07 21:31:57

标签: rust

我想使用&str方法slice_shift_char,但在documentation中标记为不稳定:

  

不稳定:等待关于移位和切片的约定而不是   由于chars和/或char_indices的存在而得到保证   迭代器

使用Rust的当前std库实现此方法的好方法是什么?到目前为止,我有:

fn slice_shift_char(s: &str) -> Option<(char, &str)> {
    let mut ixs = s.char_indices();
    let next = ixs.next();
    match next {
        Some((next_pos, ch)) => {
            let rest = unsafe {
                s.slice_unchecked(next_pos, s.len())
            };
            Some((ch, rest))
        },
        None => None
    }
}

我想避免拨打slice_unchecked。我使用的是Rust 1.1。

2 个答案:

答案 0 :(得分:4)

嗯,您可以查看源代码,然后获得https://github.com/rust-lang/rust/blob/master/src/libcollections/str.rs#L776-L778https://github.com/rust-lang/rust/blob/master/src/libcore/str/mod.rs#L1531-L1539。第二个:

fn slice_shift_char(&self) -> Option<(char, &str)> {
    if self.is_empty() {
        None
    } else {
        let ch = self.char_at(0);
        let next_s = unsafe { self.slice_unchecked(ch.len_utf8(), self.len()) };
        Some((ch, next_s))
    }
}

如果您不想要不安全,可以使用普通切片:

fn slice_shift_char(&self) -> Option<(char, &str)> {
    if self.is_empty() {
        None
    } else {
        let ch = self.char_at(0);
        let len = self.len();
        let next_s = &self[ch.len_utf8().. len];
        Some((ch, next_s))
    }
}

答案 1 :(得分:3)

不稳定的slice_shift_char函数自Rust 1.9.0以来已被弃用,并在Rust 1.11.0中完全删除。

从Rust 1.4.0开始,执行此操作的recommended approach是:

  1. 使用.chars()获取char内容
  2. 的迭代器
  3. 迭代这个迭代器一次得到第一个字符。
  4. 在该迭代器上调用.as_str()以恢复剩余的未标记字符串。
  5. fn slice_shift_char(a: &str) -> Option<(char, &str)> {
        let mut chars = a.chars();
        chars.next().map(|c| (c, chars.as_str()))
    }
    
    fn main() {
        assert_eq!(slice_shift_char("hello"), Some(('h', "ello")));
        assert_eq!(slice_shift_char("ĺḿńóṕ"), Some(('ĺ', "ḿńóṕ")));
        assert_eq!(slice_shift_char(""), None);
    }