为什么Scala的特征从右到左执行?

Why Scala's traits execute from right to left?

例如,这:

1
2
3
val queue = new BasicIntQueue with Doubling with Incrementing with Filtering
queue.put(1)
println(queue.get())

将打印:

1
2
3
4
5
Filtering
Incrementing
Doubling
put
4

对于我来说,如果按照我编写操作的顺序从左到右执行它,则将更具可读性。


因为它遵循与继承相同的模式。假设您有这样的事情:

1
2
3
4
5
6
class BasicIntQueue
class Doubling extends BasicIntQueue
class Incrementing extends Doubling
class Filtering extends Incrementing

val queue = new Filtering

您将获得与所见相同的结果:Filtering首先执行,然后传递给Incrementing,然后传递给Doubling,最后传递给BasicIntQueue


不要以为\\'executing \\',因为它不是...以为\\'layering \\':如果在右侧添加了另一个with XYZ,则在顶部添加了另一层。


真相更加复杂,请参见《语言参考》 " 5.1.2类线性化"(第56页),或Jim McBeath的解释


解决钻石多重骚扰的问题