我有一段我正在使用的代码,我发现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
等方法一起使用的正确方法是什么?
答案 0 :(得分: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))
}
迭代器不能隐式Copy
- 能够,所以你需要明确地Clone
它。
this commit时,IntoIterator
was introduced发生了变化。
这个PR也使迭代器非隐式可复制,因为这是库中微妙错误的根源。您仍然可以使用clone()来显式复制迭代器。
另见: