鉴于字符串s,索引i也就是其中?一个字符开始:
let s = "abc ? def";
let i = 4;
在该字符之后获取索引的最佳方法是什么,以便我可以对字符串进行切片并获取abc ??在代码中:
let end = find_end(s, i);
assert_eq!("abc ?", &s[0..end]);
(注意,+ 1不起作用,因为它假定字符只有 1 个字节长。)
我目前有以下几点:
fn find_end(s: &str, i: usize) -> usize {
    i + s[i..].chars().next().unwrap().len_utf8()
}
但我想知道我是否遗漏了什么,还有更好的方法吗?
您可以使用char_indices来获取下一个索引,而不是使用len_utf8字符,尽管最后一个字符有特殊情况。        
我会使用方便的str::is_char_boundary()方法。这是使用它的实现:
fn find_end(s: &str, i: usize) -> usize {
    assert!(i < s.len());
    let mut end = i+1;
    while !s.is_char_boundary(end) {
        end += 1;
    }
    end
}
通常我会让这样的函数返回,Option<usize>以防在 末尾使用索引调用它s,但现在我只是断言。
在许多情况下,与其显式调用find_end它,不如使用 进行迭代char_indices,这会为您提供每个索引以及字符;虽然如果你想知道当前角色的结局有点烦人。