在Python中,这将是final_char = mystring[-1]
。我怎样才能在Rust中做同样的事情?
我试过了
mystring[mystring.len() - 1]
但我收到错误the type 'str' cannot be indexed by 'usize'
答案 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。