rust - zipper 两条链后如何反转

标签 rust

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

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/

相关文章:

rust - 如果在Rust book 20.3中将发送Terminate消息和thread.join()放在一个循环中,为什​​么会出现死锁?

rust - 如何根据泛型类型参数赋予不同的值?

rust - 为什么我只在范围边界的一侧得到类型推断错误?

reference - 为什么我不能从闭包中返回对外部变量的可变引用?

rust - 忽略基于环境变量的测试

rust - 如何从嵌套目录访问嵌套模块/文件

rust - 如何访问 SystemTime 中的 as_secs?为枚举结果找到 "no method named ` as_secs”

data-structures - 如何在安全的 Rust 中表达相互递归的数据结构?

rust - 是否可以判断一个字段是否是某种类型或在过程宏中实现某种方法?

rust - 一次实现多种类型的特征