捕获无法复制的移动值
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: listings
。 listings
是 kuchiki::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 一样多的线程。
我正在使用 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: listings
。 listings
是 kuchiki::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 一样多的线程。