gpt4 book ai didi

rust - 如何改变 Rust 中的迭代器元素以反转子字符串

转载 作者:行者123 更新时间:2023-11-29 07:49:29 25 4
gpt4 key购买 nike

我正在尝试创建一个函数来执行以下操作:
输入一个任意长度的String,格式为“abc/def/ghi”
输出:一个String,其中所有以“/”分隔的子串被反转;在此示例中,输出将是“cba/fed/ihg”。

除了函数本身,我还关心改变由 split() 函数生成的迭代器背后的一般原则。

以下是我的最大努力:

fn reverse_string(input: &mut str) -> String {
input
.to_string()
.split('/')
.map(move |x| x.to_string().rev())
.collect::<String>()
}

编译器提示

error[E0599]: no method named `rev` found for type `std::string::String` in the current scope
--> src/main.rs:5:37
|
5 | .map(move |x| x.to_string().rev())
| ^^^
|
= note: the method `rev` exists but the following trait bounds were not satisfied:
`&mut std::string::String : std::iter::Iterator`
`&mut str : std::iter::Iterator`

这是什么意思,我该如何解决这个问题?

最佳答案

如果您正在学习迭代器,我建议您在实际操作之前先决定您想要做什么。

例如,这是一个单一内存分配的例子:

fn reverse_string(input: &str) -> String {
let mut result = String::with_capacity(input.len());

for portion in input.split('/') {
if !result.is_empty() {
result.push('/');
}
for c in portion.chars().rev() {
result.push(c);
}
}

result
}

迭代器通常专注于不修改其环境的方法。不幸的是,这可能会导致效率低下,因为这意味着左右创建和删除 String

现在,从技术上讲,您可以改变 map 中的环境(它需要一个 FnMut),这只是不受欢迎,因为按照惯例读者期望它是纯净的。

因此,当您想引入额外的状态时,Iterator::fold 是首选方法:

fn reverse_string(input: &str) -> String {
input
.split('/')
.fold(
String::with_capacity(input.len()),
|mut acc, portion| {
if !acc.is_empty() {
acc.push('/');
}
for c in portion.chars().rev() {
acc.push(c);
}
acc
}
)
}

第一个参数是一个累加器,它被传递给闭包的每次调用,然后闭包返回它。最后,在 fold 调用结束时,返回累加器。

这在逻辑和效率方面等同于第一个功能,但老实说,老实说,我更喜欢 for 版本。

关于rust - 如何改变 Rust 中的迭代器元素以反转子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com