Mixins 和 Traits 有什么不同?
根据 Wikipedia ,Ruby 模块有点像特征,为什么呢?
这些页面解释了 D 编程语言的不同之处。
Http://dlang.org/mixin.html
Http://dlang.org/traits.html
此上下文中的 Mixin 是动态生成的代码,然后在编译期间插入到代码中的该点。对于简单的 DSL 来说非常方便。
Traits 是编译时的外部值(而不是从外部源生成的代码)。区别很微妙。Mixins 添加逻辑,Traits 添加诸如编译时类型信息之类的数据。
我对 Ruby 了解不多,但希望这能有所帮助。
关于特质的讲座
广告1。 在 Mixin 中,可以定义实例变量。特质不允许这样。状态必须由组合类(= 使用 trait 的类)提供
广告2。 可能会有名字冲突。两个混合子(MA和 MB)或性状(TA和 TB)定义了具有相同定义的 foo():void方法。
MA
MB
TA
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' } }
在混合中,组合类 C mixins MA, MB中的冲突被隐式地解决。
C mixins MA, MB
Class C mixins MA, MB { bar():void { foo(); } }
这将从 MA调用 foo():void
另一方面,在使用 Traits 时,组合类必须解决冲突。
Class C mixins TA, TB { bar():void { foo(); } }
此代码将引发冲突(foo():void的两个定义)。
广告3。 方法的语义并不取决于它是在 trait 中定义的,还是在使用 trait 的类中定义的。
换句话说,类是由 Traits 组成还是 Traits 代码“复制粘贴”到类中并不重要。