在 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
迭代器进行比较。 chars
和 rev
不生成新字符串,它们生成惰性序列,就像一般的迭代器一样。 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>());
}
这有什么问题:
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
迭代器进行比较。 chars
和 rev
不生成新字符串,它们生成惰性序列,就像一般的迭代器一样。 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>());
}