gpt4 book ai didi

rust - zipper 两条链后如何反转

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

我有以下无法编译的代码。

fn main() {
let a =
"123"
.chars()
.chain("4566".chars())
.zip(
"bbb"
.chars()
.chain("yyy".chars()))
.rev()
.map(|x, y| y)
.collect::<String>();
println!("Hello, world! {}", a);
}

出现如下错误:

src/main.rs:37:10: 37:15 error: the trait `core::iter::ExactSizeIterator` is not implemented for the type `core::iter::Chain<core::str::Chars<'_>, core::str::Chars<'_>>` [E0277]
src/main.rs:37 .rev()
^~~~~
src/main.rs:37:10: 37:15 error: the trait `core::iter::ExactSizeIterator` is not implemented for the type `core::iter::Chain<core::str::Chars<'_>, core::str::Chars<'_>>` [E0277]
src/main.rs:37 .rev()
^~~~~
src/main.rs:38:10: 38:23 error: type `core::iter::Rev<core::iter::Zip<core::iter::Chain<core::str::Chars<'_>, core::str::Chars<'_>>, core::iter::Chain<core::str::Chars<'_>, core::str::Chars<'_>>>>` does not implement any method in scope named `map`
src/main.rs:38 .map(|x, y| y)

我的理解是 rev() 方法在 Iterator 中定义为实现特征 DoubleEndedIterator

fn rev(self) -> Rev<Self> where Self: DoubleEndedIterator { ... }

Zip 也实现了这个特性:

impl<A, B> DoubleEndedIterator for Zip<A, B> where B: DoubleEndedIterator + ExactSizeIterator, A: DoubleEndedIterator + ExactSizeIterator

所以问题是 Chain 没有实现 ExactSizeIterator。但我该如何解决这个问题?

我尝试为两个链添加 .take() 以将类型转换为实现 ExactSizeIteratorTake,但 Take 没有实现 DoubleEndedIterator

请注意,这是一个简化的示例。实际上,我不能先反转两条链,然后再拉 zipper 。

最佳答案

您正在寻找以下实现(剧透:它不存在):

impl<A, B> ExactSizeIterator for Chain<A, B>
where A: ExactSizeIterator, B: ExactSizeIterator { ... }

ExactSizeIterator 必须只实现一个方法,len(&self)。因此,假设实现背后的想法是对两个长度求和,以便 chain_a_b.len() == a.len() + b.len()

reason it doesn't exist是 Rust 不能保证这个加法 (usize + usize) 不会溢出。因此它禁止它。这听起来有点严格,但不幸的是,这就是目前的现状。

更糟的是:即使这个 impl 确实存在,您也会遇到 Chars 不是 ExactSizeIterator 的事实,因此它仍然无法工作。

另一种方法(可能不是唯一的方法)是将链收集到一个向量中。不好是因为内存分配,但如果它不是性能瓶颈,则值得权衡。

关于rust - zipper 两条链后如何反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820421/

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