在Python中,这将是final_char = mystring[-1]。我如何在Rust中做同样的事情?我试过了
final_char = mystring[-1]
mystring[mystring.len() - 1]
但我得到错误the type 'str' cannot be indexed by 'usize'
the type 'str' cannot be indexed by 'usize'
thigvfpy1#
这就是你如何得到最后一个char(它可能不是你认为的“字符”):
char
mystring.chars().last().unwrap();
只有在确定字符串中至少有一个字符时才使用unwrap。
unwrap
警告:关于一般情况(在Python中执行与mystring[-n]相同的操作):UTF-8字符串不能通过索引使用,因为索引不是O(1)操作(Rust中的字符串不是数组)。请阅读this了解更多信息。
mystring[-n]
但是,如果你想像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' }
hfwmuf9z2#
一种选择是使用切片。下面是一个例子:
let len = my_str.len(); let final_str = &my_str[len-1..];
这将返回从位置len-1到字符串末尾的字符串切片。也就是说,字符串的最后一个 * 字节 *。如果你的字符串只包含ASCII值,那么你将得到字符串的最后一个字符。这只适用于ASCII值的原因是因为它们只需要一个字节的存储。其他任何事情,Rust都可能在运行时出现恐慌。这就是当你试图从一个2字节的字符中切出一个字节时发生的情况。有关更详细的解释,请参阅the Rust book的字符串部分。
len-1
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
3条答案
按热度按时间thigvfpy1#
这就是你如何得到最后一个
char
(它可能不是你认为的“字符”):只有在确定字符串中至少有一个字符时才使用
unwrap
。警告:关于一般情况(在Python中执行与
mystring[-n]
相同的操作):UTF-8字符串不能通过索引使用,因为索引不是O(1)操作(Rust中的字符串不是数组)。请阅读this了解更多信息。但是,如果你想像Python一样从末尾索引,你必须在Rust中这样做:
并检查是否存在这样的字符。
如果你错过了Python语法的简单性,你可以编写自己的扩展:
hfwmuf9z2#
一种选择是使用切片。下面是一个例子:
这将返回从位置
len-1
到字符串末尾的字符串切片。也就是说,字符串的最后一个 * 字节 *。如果你的字符串只包含ASCII值,那么你将得到字符串的最后一个字符。这只适用于ASCII值的原因是因为它们只需要一个字节的存储。其他任何事情,Rust都可能在运行时出现恐慌。这就是当你试图从一个2字节的字符中切出一个字节时发生的情况。
有关更详细的解释,请参阅the Rust book的字符串部分。
qvtsj1bj3#
正如@Boiethios提到的
或者
我宁愿有(这有多难!?)