捕获无法复制的移动值

Capture of moved value that cannot be copied

我正在使用 Kuchiki to parse some HTML and making HTTP requests using hyper to concurrently operate on results through scoped_threadpool

I select 并遍历列表。我根据列表的数量决定在线程池中分配的线程数:

let listings = document.select("table.listings").unwrap();
let mut pool = Pool::new(listings.count() as u32);
pool.scoped(|scope| {
    for listing in listings {
        do_stuff_with(listing);
    }
});

当我尝试这样做时,我得到 capture of moved value: listingslistingskuchiki::iter::Select<kuchiki::iter::Elements<kuchiki::iter::Descendants>>,它是不可复制的——所以我既没有得到隐式克隆也没有得到显式 .clone

在池中,我可以再次执行 document.select("table.listings") 并且它会起作用,但这对我来说似乎没有必要,因为我已经用它来计算了。循环后我也不需要 listings

有什么方法可以让我在闭包中使用不可复制的值吗?

遗憾的是,我认为不可能按照您想要的方式去做。

您的 listings.count() 使用迭代器 listings。您可以通过编写 listings.by_ref().count() 来避免这种情况,但这不会产生预期的效果,因为 count() 将消耗迭代器的所有元素,因此对 next() 的下一次调用将始终产生None.

实现目标的唯一方法是以某种方式获取迭代器 listings 的长度而不消耗其元素。特征 ExactSizeIterator was built for this purpose, but it seems that kuchiki::iter::Select 没有实现它。请注意,对于那种迭代器,这也可能是不可能的。

编辑:正如@delnan所建议的,另一种可能性当然是将迭代器收集到Vec中。这有一些缺点,但对您来说可能是个好主意。


我还要注意,您可能不应该为 SELECT 结果集中的每一行都创建一个线程。通常线程池使用大约与 CPU 一样多的线程。