[英]Clonable iterator trait object
我正在嘗試使用可克隆的迭代器對象定義一個結構。 到目前為止,我已經達到:
pub struct UseClonableIterator2<'a,T:'a> {
it: &'a (Iterator<Item=T> + Clone)
}
無法編譯,因為Clone
不是“內置特征”:
x.rs:2:33: 2:38 error: only the builtin traits can be used as closure or object bounds [E0225]
x.rs:2 it: &'a (Iterator<Item=T> + Clone)
^~~~~
x.rs:2:33: 2:38 help: run `rustc --explain E0225` to see a detailed explanation
一種選擇可能是為迭代器添加另一個類型參數,但這會使定義復雜化,我寧願避免它。
你需要動態調度嗎? 如果沒有,您應該使用泛型參數而不是特征對象——它不一定會使定義復雜化。 試試這個,例如:
pub struct UseClonableIterator<I: Iterator + Clone> {
it: I
}
在這里,您將在您的類型中保存實現Iterator
和Clone
的對象。 如果你只是想參考它,這當然也是可能的:
pub struct UseClonableIterator2<'a, I: Iterator + Clone + 'a> {
it: &'a I
}
請注意,在兩個示例中,我們都使用靜態分派和單態化。 這通常會帶來更好的性能。
然而,這並不總是可能的——有時需要使用 trait 對象(就像你試圖實現它)的動態調度。 在這種情況下,您只能通過重構代碼來解決您的問題,因為 Rust 還不允許具有多個 trait 的 trait 對象。
如果您需要動態調度迭代器,這意味着Iterator
實現類型不能是UseClonableIterator
的類型參數,那么我將使用我的dyn-clone
crate 如下解決這個問題。
use dyn_clone::{clone_trait_object, DynClone};
trait ClonableIterator: Iterator + DynClone {}
impl<I: Iterator + DynClone> ClonableIterator for I {}
clone_trait_object!(<T> ClonableIterator<Item = T>);
#[derive(Clone)]
struct UseClonableIterator<T> {
it: Box<dyn ClonableIterator<Item = T>>,
}
fn main() {
let thing1 = UseClonableIterator {
it: Box::new(vec![1, 2, 3].into_iter()),
};
let thing2 = thing1.clone();
// prints 1 2 3 from thing1's iterator
for i in thing1.it {
println!("{}", i);
}
// prints 1 2 3 from thing2's iterator
for i in thing2.it {
println!("{}", i);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.