例如,此:为什么斯卡拉的特质从右向左执行?
val queue = new BasicIntQueue with Doubling with Incrementing with Filtering
queue.put(1)
println(queue.get())
会打印:
Filtering
Incrementing
Doubling
put
4
至于我,它会如果从左至右执行更具可读性,在为了我写操作。
例如,此:为什么斯卡拉的特质从右向左执行?
val queue = new BasicIntQueue with Doubling with Incrementing with Filtering
queue.put(1)
println(queue.get())
会打印:
Filtering
Incrementing
Doubling
put
4
至于我,它会如果从左至右执行更具可读性,在为了我写操作。
不要认为'正在执行',因为它不是......想'分层':如果在右侧添加另一个with XYZ
,则在顶部添加了另一个层。
解决钻石多重吸入问题
因为它遵循与继承相同的模式。试想一下,你有这样的事情:
class BasicIntQueue
class Doubling extends BasicIntQueue
class Incrementing extends Doubling
class Filtering extends Incrementing
val queue = new Filtering
你会得到相同的结果,当您看到:Filtering
最先被执行,然后传递给Incrementing
,然后Doubling
终于BasicIntQueue
。
事实是更加复杂,看Language Reference“5.1.2级线性化”(第56页),或通过Jim McBeath
的解释,我并不十分熟悉斯卡拉,但我猜只是怎么说代码被解析。所以它是'(((带有增量的新的BasicIntQueue)带有递增)',并且像这样的表达式被评估为最内层。 – millimoose
是的,请参阅[this](http://stackoverflow.com/questions/7230808/inheriting-a-trait-twice) –