2011-04-16 68 views
1

在Scala中,當方法調用位於操作符位置時,通過調用方法可以獲得語法糖。例如(5).+(3)可以寫爲5 + 3。這個規則是<object>.<method>(<parameter>)。這個規則是真的,圓點和括號可以留下。但我發現這個規則的一個例外:它是不是能寫超級關鍵字在運營商的地位:超級不在運營商位置?

class X { 
    def x(i: Int) = i * 2 
} 
class Y extends X { 
    override def x(i: Int) = super.x(i + 1) 
} 

當我離開超我得到一個編譯錯誤背後的點。在這裏,super是對象,x的方法和i + 1的參數,因此我不明白爲什麼我會得到一個錯誤。任何人都可以解釋嗎?

回答

5

我相信這是因爲super關鍵字必須(但看到huynhjl及以下細節註釋)應遵循的.,然後遵循的有效成員標識符 - 這似乎是文法產生式規則

考慮到val expr = (super)沒有任何意義,應該始終無效(在這方面它與this完全不同,它本身是一個有效的表達式)。在語法層面上要求super.member表格可能是故意的,但它需要一些挖掘。根據規範的說法(參見huynhjl的評論)以及按照語法「總結」規則的故意。

class X { 
    def x(): X = this 
} 
class Y extends X { 
    // Still kaboom of course -- message is effectively the same 
    // and indicates a grammar production has been violated. 
    // Message: error: '.' expected but '}' found. 
    override def x(): X = super 
} 

快樂編碼。


更新(參考文獻):

Scala Language Specification 2.8在6.5節討論super

參考super.m靜態的方法或鍵入至少適當m 包含參考的最內層模板的超類型。它將評估爲該模板的實際超類型中的 成員,該成員等於m或者其中 優先於m。所述靜態引用構件m必須是一個類型或方法 ... 超級前綴之後可以是一個性狀限定符[T],如在C.super[T].x。這個 被稱爲靜態超級參考。在這種情況下,參考的父特徵中的 x的類型或方法,其簡單名稱爲T

而且從Scala的語法摘要(第A):

stableId ::= id 
      | Path ‘.’ id 
      | [id ’.’] ‘super’ [ClassQualifier] ‘.’ id
+1

基於規範,'super.m'或'超級的措辭[T] .m'僅用於引用超類型和父特徵的*方法*或*類型*。 – huynhjl 2011-04-17 07:52:09

+0

@huynhjl謝謝:-) – 2011-04-17 17:35:08