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

mo49yndu  于 2023-05-18  发布在  其他
关注(0)|答案(3)|浏览(301)

在Python中,这将是final_char = mystring[-1]。我如何在Rust中做同样的事情?
我试过了

mystring[mystring.len() - 1]

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

thigvfpy

thigvfpy1#

这就是你如何得到最后一个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'
}
hfwmuf9z

hfwmuf9z2#

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

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

这将返回从位置len-1到字符串末尾的字符串切片。也就是说,字符串的最后一个 * 字节 *。如果你的字符串只包含ASCII值,那么你将得到字符串的最后一个字符。
这只适用于ASCII值的原因是因为它们只需要一个字节的存储。其他任何事情,Rust都可能在运行时出现恐慌。这就是当你试图从一个2字节的字符中切出一个字节时发生的情况。
有关更详细的解释,请参阅the Rust book的字符串部分。

qvtsj1bj

qvtsj1bj3#

正如@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

相关问题