簡體   English   中英

Rust:無法將特征 RangeBounds 制成 object

[英]Rust: Trait RangeBounds cannot be made into an object

我在嘗試 Rust 時偶然發現了一個問題,這可能表明我對它的概念有更大的不理解。

我的目標是編寫康威生命游戲的變體。 我希望在創建單元格或保持活動狀態時的值不是硬編碼,而是在結構中。 我的第一次嘗試是創建一個結構

use std::ops::Range;

struct Rules {
    be_born: Range<usize>,
    stay_alive: Range<usize>,
}

impl Rules {
  pub fn new(be_born: Range<usize>, stay_alive: Range<usize>) -> Rules {
    Rules { be_born, stay_alive }
  }
}

let rules = Rules::new(2..4, 3..6);

這個 object 稍后在迭代所有單元格的算法中使用。 它工作正常,直到我還想在創建過程中允許其他類型的范圍,例如 RangeTo (2..=3)。

我知道我可以將struct Rules重寫為通用的。

use std::ops::RangeBounds;

struct Rules<BR: RangeBounds<usize>, AR: RangeBounds<usize>> {
    be_born: BR,
    stay_alive: AR,
}

這反過來又會迫使我使我使用的所有算法也都是通用的。 僅僅包括兩個簡單的范圍,這似乎是相當多的開銷。

另一方面,我將RangeBounds類型的變量直接包含到我的結構中的嘗試都沒有成功。 我嘗試&dyn RangeBounds<usize>Box<&dyn RangeBounds<usize>> ,只是為了始終得到錯誤 E0038,即我無法將此特征變為 object。

有沒有其他方法可以完成這項工作,還是有其他我看不到的可行方法?

提前感謝您的所有提示。

要獲得廣泛的答案,我們需要知道您在be_bornstay_alive字段上迭代的准確程度。 但是為了解決您指出要使用不同類型范圍的問題,最簡單的方法是指定be_bornstay_alive字段都是迭代時返回usizeIterable ,即Iterator<Item=usize>

struct Rules<T, U> 
where
    T: Iterator<Item=usize>,
    U: Iterator<Item=usize>
{
    be_born: T,
    stay_alive: U,
}

impl<T, U> Rules<T, U>
where
    T: Iterator<Item=usize>,
    U: Iterator<Item=usize>
{
    pub fn new(be_born: T, stay_alive: U) -> Self {
        Self { be_born, stay_alive }
    }
}

fn main() {
    let rule = Rules::new(2..4, 3..6);
    let other_rule = Rules::new(2..=4, 3..=6);
    let another_rule = Rules::new(2..=4, 3..6);

    for x in rule.be_born {
        println!("born: {}", x);
    }
    for y in rule.stay_alive {
        println!("alive: {}", y);
    }
}

這也將允許您將非范圍但可迭代的類型分配給be_bornstay_alive字段。 如果您只想將自己限制為范圍類型,則可以將代碼中的每個Iterator<Item=usize>替換為Iterator<Item=usize> + RangeBounds<usize> ,這意味着“一種同時實現Iterator<Item=usize>RangeBounds<usize> ”。

有關Iterator trait 的進一步用法,請參閱本書

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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