[英]Vector of objects sharing a trait with PartialEq dependency
我正在嘗試創建一個vector
來存儲實現某個trait
的不同結構的對象,但是,我真的希望我的 trait 成為Eq
的超特征(因此PartialEq
)。
這本書提供了一種使用Vec<Box<dyn Draw>>
的方法,但是, PartialEq
依賴項似乎不允許這種方法,因為該特征不能成為 object錯誤。
這個答案提供了一種對HashMap
做類似事情的方法。 但是,對於我想要實現的目標,這種方法似乎過於冗長。
為實現這種特征的結構提供向量的慣用方式是什么?
在操場下面和操場上重現的代碼
pub trait MyTrait: PartialEq { fn my_func() -> bool; }
pub struct Struct1 { age: i32 }
impl PartialEq<Self> for Struct1 {
fn eq(&self, other: &Self) -> bool { self.age == other.age }
}
impl MyTrait for Struct1 {
fn my_func() -> bool { false }
}
pub struct Struct2 { year: i32 }
impl PartialEq<Self> for Struct2 {
fn eq(&self, other: &Self) -> bool { self.year == other.year }
}
impl MyTrait for Struct2 {
fn my_func() -> bool { true }
}
fn main() {
let mut v: Vec<Box<dyn MyTrait>> = Vec::new();
// v.push(Struct1 { age: 1 });
// v.push(Struct2 { year: 2 });
}
根據您的實際用例,這可能對您有用,也可能不適用,但從您的問題和評論中的信息來看,我不會 go 特征 object 路線而是枚舉路線。 將所有要作為變體存儲在枚舉中的類型,例如:
pub trait MyTrait: PartialEq { fn my_func(&self) -> bool; }
pub enum Struct {
Struct1 {
age: i32,
},
Struct2 {
year: i32,
}
}
impl PartialEq<Self> for Struct {
fn eq(&self, other: &Self) -> bool {
use Struct::*;
match (self, other) {
(Struct1 { age: age1 }, Struct1 { age: age2 }) => age1 == age2,
(Struct2 { year: year1 }, Struct2 { year: year2 }) => year1 == year2,
_ => false
}
}
}
impl MyTrait for Struct {
fn my_func(&self) -> bool {
use Struct::*;
match self {
Struct1 { .. } => false,
Struct2 { .. } => true,
}
}
}
fn main() {
let mut v: Vec<Struct> = Vec::new();
v.push(Struct::Struct1 { age: 1 });
v.push(Struct::Struct2 { year: 2 });
assert!(v.contains(&Struct::Struct2 { year: 2 }));
}
如果有更多限制會使這種方法不可行,請隨時告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.