例如,此:爲什麼斯卡拉的特質從右向左執行?
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) –