Struct 如何用trait的不同实现实例化同一个结构?

Struct 如何用trait的不同实现实例化同一个结构?,struct,rust,traits,Struct,Rust,Traits,我有一个特点,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构,它们有不同的实现。对于抽象,我将这些结构称为A-Z: trait Trait { fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>; } 有没有其他方法来实现这一点,以便结构的每个实例都有一个不同的trait实现,或者创建一个新结构是最好的方法 我不熟悉编译语言。我所做的大部分工作都是使用

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

trait Trait {
    fn bar<T: Trait> (&self, z: &Struct3<T>) -> Struct3<T>;
}
有没有其他方法来实现这一点,以便结构的每个实例都有一个不同的trait实现,或者创建一个新结构是最好的方法


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

一种方法是使您的trait在某些类型上具有泛型,即使该类型实际上没有在trait内部使用

性状{/*…*/} 这使您能够为同一个结构多次实现它

结构{/*…*/}的impl特征 结构{/*…*/}的impl特征 在这里,bool和u32只是成为编译时标志,用于选择要使用的Trait的实现

让struct_3a=Trait:::bar&my_对象,/*…*/; 让struct_3b=Trait:::bar&my_对象,/*…*/;
我在这里使用了bool和u32,但是你可以在这里使用你自己的类型来让一切变得更清楚。

一种方法是使你的特征在某些类型上通用,即使这种类型实际上没有在特征内部使用

性状{/*…*/} 这使您能够为同一个结构多次实现它

结构{/*…*/}的impl特征 结构{/*…*/}的impl特征 在这里,bool和u32只是成为编译时标志,用于选择要使用的Trait的实现

让struct_3a=Trait:::bar&my_对象,/*…*/; 让struct_3b=Trait:::bar&my_对象,/*…*/;
我在这里使用了bool和u32,但是您可以在这里使用您自己的类型来让一切更清楚。

唯一的区别是点值吗?还是比这更复杂?您将如何在Python或Typescript中实现这一点?它比这个示例更复杂。我简化了程序,以便于提问。在python或OO语言中,我将把trait作为接口,并用基类实现它。然后,我将用类A扩展基类。。。Z@WhyNot我认为您试图在一个面向对象的模式上坚持太久了,因为x Rust没有继承的概念,所以问题的解决方式通常是完全不同的。我建议你明确你的意图。好吧,那我就试着想出一个更好的重构方法。在大学里,我在OO原则上压力很大,但我一直试图打破这个习惯。非常感谢。唯一的区别是分值吗?还是比这更复杂?您将如何在Python或Typescript中实现这一点?它比这个示例更复杂。我简化了程序,以便于提问。在python或OO语言中,我将把trait作为接口,并用基类实现它。然后,我将用类A扩展基类。。。Z@WhyNot我认为您试图在一个面向对象的模式上坚持太久了,因为x Rust没有继承的概念,所以问题的解决方式通常是完全不同的。我建议你明确你的意图。好吧,那我就试着想出一个更好的重构方法。在大学里,我在OO原则上压力很大,但我一直试图打破这个习惯。非常感谢。这是一个非常好的主意,我可能会在某个时候使用它!不幸的是,结构A…Z的实际数量将达到数千个,所以我认为这对这个实现不起作用。这是一个非常有趣的破解方法,你可以使用空结构,比如struct VariantA;而不是像bool这样的原始类型来表示泛型特征;这可能会使它更清晰,并消除对可伸缩性的担忧。您还可以通过将impl与包含不同类型的枚举挂钩来简化操作。这是一个非常好的主意,我可能会在某个时候使用它!不幸的是,结构A…Z的实际数量将达到数千个,所以我认为这对这个实现不起作用。这是一个非常有趣的破解方法,你可以使用空结构,比如struct VariantA;而不是像bool这样的原始类型来表示泛型特征;这可能会使它更清晰,并消除对可伸缩性的担忧。通过将impl与包含不同类型的枚举挂钩,还可以使事情变得更简单。
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,
        }
    }
}