我有一段我正在使用的代码,我找到了在另一个堆栈溢出问题中
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))
}当我最初发现它的时候,它工作得很好,但是在1/30/15和2/17/12之间的锈蚀之夜发生了一些变化,导致了这个新的错误弹出:
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**?**这样的方法一起使用
发布于 2015-02-19 20:07:57
您不需要克隆底层数据(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它。
此PR还使迭代器不可隐式复制,因为这是库中细微bug的来源。您仍然可以使用克隆()来明确地复制迭代器。
另请参阅:
https://stackoverflow.com/questions/28615756
复制相似问题