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

5
例如,这个例子:
val queue = new BasicIntQueue with Doubling with Incrementing with Filtering
queue.put(1)
println(queue.get())

将打印:

Filtering
Incrementing
Doubling
put
4

对于我来说,如果按照我写的操作顺序从左到右执行,那么这将更易读。


2
我对Scala不是特别熟悉,但我猜测代码是如何解析的。所以它是 (((new BasicIntQueue with Doubling) with Incrementing) with Filtering),并且像这样的表达式是从最内层括号开始评估的。 - millimoose
是的,请查看这个链接 - S.R.I
4个回答

7

因为它遵循与继承相同的模式。想象一下你有这样一个东西:

class BasicIntQueue 
class Doubling extends BasicIntQueue
class Incrementing extends Doubling
class Filtering extends Incrementing

val queue = new Filtering

你将得到与你看到的相同的结果:过滤首先被执行,然后传递给增量,然后是加倍,最后是基本整数队列

6

不要想着“执行”,因为它并不是... 要想着“分层”:如果你在右侧添加另一个with XYZ,那么你就添加了另一层。


3
实际情况更为复杂,请参见语言参考的“5.1.2 类线性化”(第56页),或Jim McBeath的解释。

0

为了解决多重继承的钻石问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接