在 Rust 中反转字符串

Reversing a string in Rust

这有什么问题:

fn main() {
    let word: &str = "lowks";
    assert_eq!(word.chars().rev(), "skwol");
}

我收到这样的错误:

error[E0369]: binary operation `==` cannot be applied to type `std::iter::Rev<std::str::Chars<'_>>`
 --> src/main.rs:4:5
  |
4 |     assert_eq!(word.chars().rev(), "skwol");
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: an implementation of `std::cmp::PartialEq` might be missing for `std::iter::Rev<std::str::Chars<'_>>`
  = note: this error originates in a macro outside of the current crate

正确的做法是什么?

第一个也是最基本的问题是,这不是反转 Unicode 字符串的方式。您正在反转代码点的顺序,您想要反转 graphemes 的顺序。可能还有其他我不知道的问题。文字很难。

编译器指出了第二个问题:您正在尝试将字符串文字与 char 迭代器进行比较。 charsrev 不生成新字符串,它们生成惰性序列,就像一般的迭代器一样。 The following works:

/*!
Add the following to your `Cargo.toml`:

```cargo
[dependencies]
unicode-segmentation = "0.1.2"
```
*/
extern crate unicode_segmentation;
use unicode_segmentation::UnicodeSegmentation;

fn main() {
    let word: &str = "loẅks";
    let drow: String = word
        // Split the string into an Iterator of &strs, where each element is an
        // extended grapheme cluster.
        .graphemes(true)
        // Reverse the order of the grapheme iterator.
        .rev()
        // Collect all the chars into a new owned String.
        .collect();

    assert_eq!(drow, "skẅol");

    // Print it out to be sure.
    println!("drow = `{}`", drow);
}

请注意,graphemes 曾经作为一种不稳定的方法出现在标准库中,因此上面的方法会破坏足够旧的 Rust 版本。在这种情况下,您需要改用 UnicodeSegmentation::graphemes(s, true)

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

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