如何获得& str的最后一个字符?

时间:2018-02-06 11:46:02

标签: string rust

在Python中,这将是final_char = mystring[-1]。我怎样才能在Rust中做同样的事情?

我试过了

mystring[mystring.len() - 1]

但我收到错误the type 'str' cannot be indexed by 'usize'

2 个答案:

答案 0 :(得分:13)

这就是你获得最后一个char的方式(这可能不是你所认为的"字符"):

mystring.chars().last().unwrap();

仅当您确定字符串中至少有一个字符时才使用unwrap

警告:关于一般情况(与Python中的mystring[-n]做同样的事情):UTF-8字符串不能通过索引使用,因为索引不是O( 1)操作(Rust中的字符串不是数组)。有关详细信息,请阅读this

但是,如果你想像Python一样从头开始编制索引,你必须在Rust中执行此操作:

mystring.chars().rev().nth(n - 1) // Python: mystring[-n]

并检查是否有这样的角色。

如果您错过了Python语法的简单性,您可以编写自己的扩展名:

trait StrExt {
    fn from_end(&self, n: usize) -> char;
}

impl<'a> StrExt for &'a str {
    fn from_end(&self, n: usize) -> char {
        self.chars().rev().nth(n).expect("Index out of range in 'from_end'")
    }
}

fn main() {
    println!("{}", "foobar".from_end(2)) // prints 'b'
}

答案 1 :(得分:2)

我将使用slices进行此操作。这是一个示例:

let len = my_str.len();
let final_str = &my_str[len-1..];

这将返回从位置len-1到字符串结尾的字符串片段。也就是说,字符串中包含的最终值。

当然,这有点骇人听闻。每当我在Rust中使用字符串时,我都会用它代替索引。例如,如果我想要一个字符串的第一个元素,那么我可以使用my_str[0..1]来获取一个从0到1的切片,这与my_str[0]相同,如果索引适用于Rust字符串。

在某些情况下,该方法会崩溃,即explained in the Rust book