Rust 把生锈的绳子倒过来

Rust 把生锈的绳子倒过来,rust,Rust,这有什么问题吗 fn main() { let word: &str = "lowks"; assert_eq!(word.chars().rev(), "skwol"); } 我得到一个类似这样的错误: error[E0369]:二进制操作“==”不能应用于类型`std::iter::Rev>` =注意:此错误源于当前板条箱外部的宏 正确的方法是什么?第一个也是最基本的问题是,这不是如何反转Unicode字符串。您正在反转代码点的顺序,您希望反转图形的顺序。可能还有

这有什么问题吗

fn main() {
    let word: &str = "lowks";
    assert_eq!(word.chars().rev(), "skwol");
}
我得到一个类似这样的错误:

error[E0369]:二进制操作“==”不能应用于类型`std::iter::Rev>`
=注意:此错误源于当前板条箱外部的宏

正确的方法是什么?

第一个也是最基本的问题是,这不是如何反转Unicode字符串。您正在反转代码点的顺序,您希望反转图形的顺序。可能还有其他我不知道的问题。文本是硬的

编译器指出了第二个问题:您试图将字符串文本与
char
迭代器进行比较
chars
rev
不会生成新字符串,它们会生成惰性序列,通常与迭代器一样:


请注意,
graphemes
曾经作为一种不稳定的方法存在于标准库中,因此上述方法将因足够旧的版本而失效。在这种情况下,您需要使用UnicodeSegmentation::graphemes(s,true)。

因为,作为@DK。建议,
.graphemes()
在stable中的
&str
上不可用,您不妨按照@huon在评论中的建议执行:

fn main() {
    let foo = "palimpsest";
    println!("{}", foo.chars().rev().collect::<String>());
}
fn main(){
let foo=“palimpsest”;
println!(“{}”,foo.chars().rev().collect::());
}

我认为您可以只
.rev().collect()
,因为
String
实现了来自迭代器的
。另外,fwiw,我认为实际最基本的问题是对迭代器、字符串和类型的误解(可以理解,许多语言并不是那么“迂腐”),并非unicode正确性的更细微之处。@dbaupp:我认为独立于实现语言的问题比特定于特定语言的问题更为根本但是很高兴知道
String
支持来自迭代器的
。有点遗憾的是,它没有预先分配存储空间,但你不能总是得到你想要的…呃,问题是为什么某段代码没有用特定的语言编译,而不是为什么它会给出意外的输出(即,算法中与语言无关的问题),因此,问题本身的根本问题是特定类型的错误。不过,提到unicode很难,这绝对是件好事。正如DK在回答中提到的,这可能是错误的。例如,它@Shepmaster看起来像
“Åstrỏm”
在上面的游乐场链接中使用
chars()
。至少我看到的输出是
m̊orts̊A
。不确定stable最近是否更新以支持此功能。@MilesF
Ås
vs
s̊A
/
o̊m
vs
m̊o
这一点不错。在“操场输出”窗口中,事情似乎更加协调一致。
fn main() {
    let foo = "palimpsest";
    println!("{}", foo.chars().rev().collect::<String>());
}