如何使用特征的不同实现实例化相同的结构?

Why*_*Not 2 struct traits rust

我有一个由同一个结构以不同方式实现的特征。为了实现这一点,我有不同的结构,它们具有不同的实现。对于抽象,我将把这些结构称为 AZ:

trait Trait {
    fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>;
}
Run Code Online (Sandbox Code Playgroud)
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,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
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,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有另一种方法来解决这个问题,以便结构的每个实例都有不同的特征实现,或者制作一个新的结构是最好的方法?

我是编译语言的新手。我所做的大部分工作都是使用 Python 和 TypeScript。

Gym*_*ore 5

一种方法是使您的 trait 对某种类型具有泛型(即使该类型实际上并未在 trait 内使用)。

trait Trait<T> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

这使您可以为同一个结构多次实现它。

impl Trait<bool> for Struct { /* ... */ }
impl Trait<u32> for Struct { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

在这里,boolu32刚刚成为编译时标志来选择的实现Trait要使用。

let struct_3a = Trait::<bool>::bar(&my_object, /* ... */);
let struct_3b = Trait::<u32>::bar(&my_object, /* ... */);
Run Code Online (Sandbox Code Playgroud)

我在这里使用boolu32,但你可以在这里使用你自己的类型来使一切更清晰。

  • 您可以使用“struct VariantA;”等空结构来代替“bool”等基本类型作为通用特征;这可能会使其更加清晰并消除对可扩展性的担忧。 (2认同)