我如何借用Iterator?

Twe*_*les 2 rust

我有一段我正在使用的代码,我在另一个Stack Overflow问题中找到

fn is_palindromic(num: i64) -> bool {
    let string = num.to_string();
    let bytes = string.as_bytes();
    let iter = bytes.iter();
    let n = bytes.len() / 2;
    equals(iter.take(n), iter.rev().take(n))
}
Run Code Online (Sandbox Code Playgroud)

当我最初找到它时这很好用,但是在2015年1月30日和2012年2月17日之间的Rust nightlies中发生了一些变化,导致弹出这个新错误:

src/program.rs:8:26: 8:30 error: use of moved value: `iter`
src/program.rs:8     equals(iter.take(n), iter.rev().take(n))
                                          ^~~~
src/program.rs:8:12: 8:16 note: `iter` moved here because it has type `core::slice::Iter<'_, u8>`, which is non-copyable
src/program.rs:8     equals(iter.take(n), iter.rev().take(n))
                            ^~~~
Run Code Online (Sandbox Code Playgroud)

我查看了文档,但我似乎无法找到任何可能表明可能发生变化的内容.看起来这个take方法现在的行为可能有所不同,但我不确定如何解决克隆bytes和使用两个单独的迭代器之间的情况.

这似乎是一种解决看似非常常见问题的非常低效的方法,所以我想我可能会遗漏一些东西.

借用迭代器以使用类似方法的正确方法是std::iter::order::equals什么?

She*_*ter 7

您不需要克隆底层数据(bytes),但您需要克隆迭代器:

fn is_palindromic(num: i64) -> bool {
    let string = num.to_string();
    let bytes = string.as_bytes();
    let iter = bytes.iter();
    let n = bytes.len() / 2;
    equals(iter.clone().take(n), iter.rev().take(n))
}
Run Code Online (Sandbox Code Playgroud)

迭代器不是可隐式的Copy,因此您需要明确Clone它.

这个提交在更改时IntoIterator引入了:

此PR还使迭代器非隐式可复制,因为这是库中的细微错误的来源.您仍然可以使用clone()来显式复制迭代器.

也可以看看: