161

Mixins 和 Traits 有什么区别?

根据 Wikipedia,Ruby 模块有点像特征。怎么会这样?

4

2 回答 2

225
  1. Mixins 可能包含状态,(传统)特征不包含。
  2. Mixins 使用“隐式冲突解决”,特征使用“显式冲突解决”
  3. Mixins 依赖于线性化,特征是扁平化的。

关于特质的讲座

广告 1. 在 mixins 中,您可以定义实例变量。特性不允许这样做。必须通过组合类来提供状态(=使用特征的类)

ad 2. 可能存在名称冲突。两个 mixin ( MAand MB) 或 traits ( TAand TB) 定义了具有相同定义的方法foo():void

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

在 mixin 中,组合类C mixins MA, MB 中的冲突是隐式解决的。

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

foo():void将从MA

另一方面,在使用 Traits 时,组合类必须解决冲突。

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

此代码将引发冲突(的两个定义foo():void)。

ad 3. 方法的语义不取决于它是定义在特征中还是在使用该特征的类中。

换句话说,无论类是由 Traits 组成还是 Traits 代码“复制 - 粘贴”到类中都没有关系。

于 2011-01-26T09:15:22.263 回答
9

这些页面解释了 D 编程语言的区别。

http://dlang.org/mixin.html

http://dlang.org/traits.html

在这种情况下,mixin 是动态生成的代码,然后在编译期间插入到代码中。对于简单的 DSL 来说非常方便。

特征是编译时的外部值(而不是从外部源生成的代码)。差异是微妙的。Mixins 添加逻辑,Traits 添加编译时类型信息等数据。

对Ruby不太了解,但希望这会有所帮助。

于 2009-05-29T11:44:09.043 回答