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

问题描述 投票:0回答:4

在 Python 中,这将是

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

我已经尝试过了

mystring[mystring.len() - 1]

但我收到错误

the type 'str' cannot be indexed by 'usize'

string rust
4个回答
45
投票

这就是你得到最后一个

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'
}

22
投票

一种选择是使用切片。这是一个例子:

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

这将返回从位置

len-1
到字符串末尾的字符串切片。也就是说,字符串的最后一个byte。如果您的字符串仅包含 ASCII 值,那么您将获得字符串的最终字符。

之所以只适用于 ASCII 值,是因为它们只需要一个字节的存储空间。如果有其他情况,Rust 可能会在运行时出现恐慌。当您尝试从 2 字节字符中切出一个字节时,就会发生这种情况。

更详细的解释,请参阅Rust 书的字符串部分。


5
投票

正如@Boiethios提到的

let last_ch = mystring.chars().last().unwrap();

或者

let last_ch = codes.chars().rev().nth(0).unwrap();

我宁愿(这有多难!?)

let last_ch = codes.chars(-1); // Not implemented as rustc 1.56.1

0
投票

还有另一种方法,取决于上下文。如果您只想评估字符串的最后一个字符是什么,您可以简单地使用ends_with 方法。例如,假设我想删除“/”,如果这是用户输入的字符串路径的最后一个字符。然后,我可以简单地做:

if path.ends_with('/') {
    path.pop();
}
© www.soinside.com 2019 - 2024. All rights reserved.