如何使用特征的不同实现实例化相同的结构?
How to instantiate the same struct with different implementations of a trait?
我有一个特征,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构具有不同的实现。为了抽象,我将这些结构称为 A-Z:
trait Trait {
fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>;
}
struct StructA {
name: String,
color: String,
}
impl Trait for StructA {
fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>{
let mut list = Vec::new();
list.push(self.clone());
let y = Struct2::<T> {
name: z.y.name,
list: list,
};
Struct3::<T> {
point: 1,
y: y,
}
}
}
struct StructZ {
name: String,
color: String,
}
impl Trait for StructZ {
fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>{
let mut list = Vec::new();
list.push(self.clone());
let y = Struct2::<T> {
name: z.y.name,
list: list,
};
Struct3::<T> {
point: 26,
y: y,
}
}
}
是否有另一种方法来解决这个问题,以便结构的每个实例都有不同的特征实现,或者创建一个新的结构是最好的方法?
我是编译语言的新手。我所做的大部分工作都是使用 Python 和 TypeScript。
实现这一点的一种方法是使您的特征对某种类型具有通用性(即使该类型实际上并未在特征内部使用)。
trait Trait<T> { /* ... */ }
这使您能够为同一结构多次实现它。
impl Trait<bool> for Struct { /* ... */ }
impl Trait<u32> for Struct { /* ... */ }
在这里,bool
和 u32
只是成为编译时标志来选择要使用的 Trait
的实现。
let struct_3a = Trait::<bool>::bar(&my_object, /* ... */);
let struct_3b = Trait::<u32>::bar(&my_object, /* ... */);
我在这里使用了 bool
和 u32
,但是你可以在这里使用你自己的类型来使一切更清楚。
我有一个特征,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构具有不同的实现。为了抽象,我将这些结构称为 A-Z:
trait Trait {
fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>;
}
struct StructA {
name: String,
color: String,
}
impl Trait for StructA {
fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>{
let mut list = Vec::new();
list.push(self.clone());
let y = Struct2::<T> {
name: z.y.name,
list: list,
};
Struct3::<T> {
point: 1,
y: y,
}
}
}
struct StructZ {
name: String,
color: String,
}
impl Trait for StructZ {
fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>{
let mut list = Vec::new();
list.push(self.clone());
let y = Struct2::<T> {
name: z.y.name,
list: list,
};
Struct3::<T> {
point: 26,
y: y,
}
}
}
是否有另一种方法来解决这个问题,以便结构的每个实例都有不同的特征实现,或者创建一个新的结构是最好的方法?
我是编译语言的新手。我所做的大部分工作都是使用 Python 和 TypeScript。
实现这一点的一种方法是使您的特征对某种类型具有通用性(即使该类型实际上并未在特征内部使用)。
trait Trait<T> { /* ... */ }
这使您能够为同一结构多次实现它。
impl Trait<bool> for Struct { /* ... */ }
impl Trait<u32> for Struct { /* ... */ }
在这里,bool
和 u32
只是成为编译时标志来选择要使用的 Trait
的实现。
let struct_3a = Trait::<bool>::bar(&my_object, /* ... */);
let struct_3b = Trait::<u32>::bar(&my_object, /* ... */);
我在这里使用了 bool
和 u32
,但是你可以在这里使用你自己的类型来使一切更清楚。