[英]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_born
和stay_alive
字段上迭代的准確程度。 但是為了解決您指出要使用不同類型范圍的問題,最簡單的方法是指定be_born
和stay_alive
字段都是迭代時返回usize
的Iterable
,即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_born
和stay_alive
字段。 如果您只想將自己限制為范圍類型,則可以將代碼中的每個Iterator<Item=usize>
替換為Iterator<Item=usize> + RangeBounds<usize>
,這意味着“一種同時實現Iterator<Item=usize>
和RangeBounds<usize>
”。
有關Iterator
trait 的進一步用法,請參閱本書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.