【问题标题】:How do I borrow an Iterator?如何借用迭代器?
【发布时间】:2015-02-19 19:59:07
【问题描述】:

我有一段我正在使用的代码,我发现 in another Stack Overflow question

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))
}

当我最初发现它时它运行良好,但是在 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))
                            ^~~~

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

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

借用迭代器以与std::iter::order::equals 等方法一起使用的正确方法是什么?

【问题讨论】:

    标签: rust


    【解决方案1】:

    您不需要克隆底层数据 (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))
    }
    

    迭代器不是隐式的Copy-able,所以你需要显式地Clone它。

    这在this commit 中发生了变化,当时IntoIterator was introduced

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

    另见:

    【讨论】:

    • 太棒了,结果证明这是一个非常简单的解决方案。你知道最近 Rust 发生了什么变化使得这变得必要吗?
    • @TwentyMiles 更新了该信息。
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多