我想使用&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。
好吧,你可以查看源代码,你会得到https://github.com/rust-lang/rust/blob/master/src/libcollections/str.rs#L776-L778和https://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))
}
}
不稳定的slice_shift_char
函数自Rust 1.9.0以来已被弃用,并在Rust 1.11.0中完全删除。
从Rust 1.4.0开始,执行此操作的recommended approach是:
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);
}