簡體   English   中英

可克隆的迭代器特征對象

[英]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
}

在這里,您將在您的類型中保存實現IteratorClone的對象。 如果你只是想參考它,這當然也是可能的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM