使用std库实现slice_shift_char

Mar*_*ila 6 rust

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

不稳定:等待有关移位和切片的约定,并且可能无法保证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
    }
}
Run Code Online (Sandbox Code Playgroud)

我想避免打电话给slice_unchecked.我正在使用Rust 1.1.

Ste*_*nik 5

好吧,你可以查看源代码,你会得到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))
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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))
    }
}
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 5

stableslice_shift_char函数自 Rust 1.9.0 起已被弃用,并在 Rust 1.11.0 中完全删除。

\n\n

从 Rust 1.4.0 开始,推荐的实现方法是:

\n\n
    \n
  1. 用于.chars()获取char内容的迭代器
  2. \n
  3. 迭代此迭代器一次以获得第一个字符。
  4. \n
  5. 调用.as_str()该迭代器来恢复剩余的联合字符串。
  6. \n
\n\n\n\n
fn slice_shift_char(a: &str) -> Option<(char, &str)> {\n    let mut chars = a.chars();\n    chars.next().map(|c| (c, chars.as_str()))\n}\n\nfn main() {\n    assert_eq!(slice_shift_char("hello"), Some((\'h\', "ello")));\n    assert_eq!(slice_shift_char("\xc4\xba\xe1\xb8\xbf\xc5\x84\xc3\xb3\xe1\xb9\x95"), Some((\'\xc4\xba\', "\xe1\xb8\xbf\xc5\x84\xc3\xb3\xe1\xb9\x95")));\n    assert_eq!(slice_shift_char(""), None);\n}\n
Run Code Online (Sandbox Code Playgroud)\n