当前位置: 首页 > 知识库问答 >
问题:

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

曾鸿振
2023-03-14

我有一个特点,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构,它们有不同的实现。对于抽象,我将这些结构称为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,
        }
    }
}

有没有其他方法来实现这一点,以便结构的每个实例都有一个不同的trait实现,或者创建一个新结构是最好的方法?

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

共有1个答案

张浩阔
2023-03-14

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

trait Trait<T> { /* ... */ }

这使您能够为同一个结构多次实现它。

impl Trait<bool> for Struct { /* ... */ }
impl Trait<u32> for Struct { /* ... */ }

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

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

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

 类似资料:
  • 我有广泛的基本特征。有些类型只关心其功能的子集,所以我添加了一个子集,要求用户实现更小的功能集。 此代码失败: 出现以下错误: 有趣的是,当我删除上的通用性时,它就起作用了: stackoverflow上的其他一些帖子也提到了类似的问题,但它们通常都有关于外来特征的问题(来自标准库的)。在我的案例中,特质和类型都是本地的,因此就我所知,孤儿规则不应该生效。 基本上,错误提到下游板条箱可能实现tra

  • 我有一个问题: 多个结构实现一个trait 都可以以相同的方式实现trait 我考虑过写这个(简短版本) 游戏场 这无法编译: 这里怎么了?或者有没有其他方法可以通用地实现此,而不必为和分别键入一次? 谢谢你们

  • 问题内容: 假设您正在Rails中实现REST API。在提供集合时,您可能只希望包含一些属性: 但是在提供单个资源时,您要包括所有属性: 我看不到如何使用ActiveModel :: Serializers来做到这一点,因为这些示例都使用了一种模式,即为每个模型定义一个序列化器(使用标准命名约定),并让AMS在执行操作时自动在控制器中使用正确的序列化器: 要么: 问题答案: 为避免将视图关注点混

  • 我正在尝试使用匕首学习依赖注入。 我明白,在您的类中,您不会直接实例化客户机代码所依赖的对象,而是使用@inject声明它,通过模块创建ObjectGraphs,并从ObjectGraph中获取对象: 谢谢你。

  • 页面有多个div元素,点击这些div元素将弹出一个遮罩层,遮罩层内显示所点击的对应的内容,请教大佬们该如何用jQuery实现? 具体如下图: 对应代码: 点击div元素弹出的遮罩层根据所点击的div显示对应的内容,如下图: 因为后期会有多个div元素,请问大佬们能否做成数据串的形式,点击那个就把对应的数据插入到这个遮罩层框架内