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

String 如何获取a&;的最后一个字符;str?,string,rust,String,Rust,在Python中,这将是final\u char=mystring[-1]。我怎样才能在生锈的情况下做同样的事情 我试过了 mystring[mystring.len() - 1] 但是我得到一个错误,类型'str'不能被'usize'索引这就是你得到最后一个字符的方式(这可能不是你认为的“字符”): 只有在确定字符串中至少有一个字符时,才使用unwrap 警告:关于一般情况(与Python中的mystring[-n]做相同的事情):UTF-8字符串不能通过索引使用,因为索引不是O(1)操作

在Python中,这将是
final\u char=mystring[-1]
。我怎样才能在生锈的情况下做同样的事情

我试过了

mystring[mystring.len() - 1]

但是我得到一个错误,
类型'str'不能被'usize'索引

这就是你得到最后一个
字符的方式(这可能不是你认为的“字符”):

只有在确定字符串中至少有一个字符时,才使用
unwrap


警告:关于一般情况(与Python中的
mystring[-n]
做相同的事情):UTF-8字符串不能通过索引使用,因为索引不是O(1)操作(Rust中的字符串不是数组)。请阅读更多信息

但是,如果希望像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'
}
trait-StrExt{
fn from_end(&self,n:usize)->char;
}
impl字符{
self.chars().rev().nth(n).expect(“在'from_end'中索引超出范围”)
}
}
fn main(){
println!(“{}”,“foobar.”from_end(2))//打印“b”
}
一个选项是使用。下面是一个例子:

let len = my_str.len();
let final_str = &my_str[len-1..];
这将返回从位置
len-1
到字符串末尾的字符串片段。也就是说,字符串的最后一个字节。如果字符串仅由ASCII值组成,则将获得字符串的最后一个字符

这只适用于ASCII值的原因是它们只需要一个字节的存储空间。除此之外,运行时生锈可能会引起恐慌。这就是当您尝试从2字节字符中切出一个字节时发生的情况


有关更详细的解释,请参阅。

的字符串部分。您所说的字符是指unicode代码点?@BB您应该回答的问题,主要是您自己,是
cafe
的最后一个“字符”是
e
还是
'
。如果它应该是
é
,那么您希望通过graphemes而不是
char
s进行迭代。@BB我认为您是在向后看。文本处理很困难,因为人类语言很复杂,将它们编码到计算机中也很复杂。Rust有一小部分观点(例如字符串是UTF-8),但是为了让程序员能够为他们的案例构建正确的抽象,必须对其他观点置之不理。正如其他人所提到的,将字符串视为一袋袋字符最终是不正确的,因为在我们的全球世界中,“字符”一开始定义得很糟糕。@BB Python 3在正确的Unicode处理方面取得了巨大的进步,但它仍然没有提供一种简单的方法来处理字符集——Rust(使用
unicode分段
板条箱)实际上在这方面更好。如果你复制并粘贴
“café”[-1]
到你的Python解释器中,它可能不会给你
“é”
@BB@erip还没有读到这本书的那一部分,但是感谢你的指导!@BB还应该注意,这是一个O(n)Rust中的操作,与Python的O(1)相反。您不应该像对待数组一样对待字符串。@DK为了澄清,获取最后一个字符是一个O(1)操作。从任意一端获取第n个字符是O(n),其中n是索引。“我觉得不鼓励使用
unwrap
”这是一个问题。
unwrap
是否表示任何潜在的错误都是不可恢复的,不应该发生。这种情况仍然存在合法的理由。说解决方案有问题,但不说明这些问题是什么,这是一个非常糟糕的答案。与外部资源的链接很好,但任何相关的答案本身需要包含信息。也就是说,字符串中包含的最终值。-除非您处理的是仅ASCII文本,否则这是不正确的;随着时间的推移,这种情况越来越不正确。想想表情符号。
let len = my_str.len();
let final_str = &my_str[len-1..];