在 Python 中,这将是
final_char = mystring[-1]
。我怎样才能在 Rust 中做同样的事情?
我已经尝试过了
mystring[mystring.len() - 1]
但我收到错误
the type 'str' cannot be indexed by 'usize'
这就是你得到最后一个
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'
}
正如@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
还有另一种方法,取决于上下文。如果您只想评估字符串的最后一个字符是什么,您可以简单地使用ends_with 方法。例如,假设我想删除“/”,如果这是用户输入的字符串路径的最后一个字符。然后,我可以简单地做:
if path.ends_with('/') {
path.pop();
}