2015-04-23 59 views
1

我遇到一個問題,即隱式的()=>X轉換髮生在我定義和使用一元運算符時。下面是一個小例子:爲什麼一元運算符啓用a()=> X隱式轉換?

class Gate { 
    def unary_!(): Gate = this 
} 

class Foo { 
    private def foo(f:() => Gate) = 1 
    val gate = new Gate 

    // Compiles, -Xprint:typer shows it becomes 
    // Foo.this.foo({ 
    //  (() => Foo.this.gate.unary_!()) 
    // }) 
    foo(!gate) 

    // Does not compile, we get 
    // error: type mismatch; 
    // found : Gate 
    // required:() => Gate 
    // foo(gate) 
    foo(gate) 
} 

哪裏這個() => Gate轉換髮生,爲什麼它只有unary_!發生的呢?


編輯

感謝您的回答!我提出這個問題,因爲埃塔擴張(從X() => X塊我們爲X定義,並希望發生的另一個隱式轉換。從unary_!刪除不必要的括號內爲我們解決了這個問題。謝謝!

+1

爲什麼當你明確地寫'!gate'而不是'gate'時,你認爲這是一個隱式轉換? –

+0

這與編寫'-5'而不是'5'相同。它適用於整數'5'上的一元運算符'-'。這可能是通過在一元運算符的參數上使用'reflection'來完成的,然後應用相應的函數。這與「隱含」無關。 –

+0

@SarveshKumarSingh,我指的是函數foo的參數。注意它需要一個()=> Gate,但我用Gate調用它。 – user716468

回答

5

這僅僅是ETA-擴大,它變成一個方法成一個函數。

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#eta-expansion

該觸發器是預期的類型是一個函數。

鏈路是spec曖昧,但擴張在6.26.5。

比較這兩種形式:

scala> foo(gate.unary_!()) 
<console>:11: error: type mismatch; 
found : Gate 
required:() => Gate 
       foo(gate.unary_!()) 
          ^

scala> foo(gate.unary_!) 
res3: Int = 1 

第一種情況是該功能的應用。不打字檢查。

第二種情況是什麼?它不會隱式地將parens添加到應用程序中,而會首先通過eta擴展來創建函數,進行哪種類型的檢查。

有人建議添加parens(規範中的「空應用程序」)應該優先,以便它的行爲與第一種情況相同。

下面是前綴OP如何處理該規範措詞:

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#prefix-operations

前綴操作運算,E由前綴操作符op,其必須 是標識符「中的一個的+ ',' - ','!'或'〜'。表達式op; e是 相當於後綴方法應用程序e.unary_op。

但是這個例子表明它是一個成員選擇,但不是應用程序。

這裏的反例,不會對您的方法定義的括號:

scala> class Gate { def unary_! : Gate = this } 
defined class Gate 

scala> def foo(f:() => Gate) = 1 
foo: (f:() => Gate)Int 

scala> val gate = new Gate 
gate: Gate = [email protected] 

scala> foo(!gate) 
<console>:11: error: type mismatch; 
found : Gate 
required:() => Gate 
       foo(!gate) 
       ^

有你第一次簡單的評價,在6.26.2第一次轉換。

更多示例on the related ticket

上鍊接的票的註釋有建議不僅改變implicits的順序,但禁用ETA-擴大這種情況:

我傾向於更進一步,棄用ETA-擴大給予 Function0的預期類型,並避免從一開始就以相同形狀的SAM類型 來觸發它。

這太糟糕了,因爲這會讓一個不錯的小困惑者。

+0

我很難理解規範,並想知道是否有關於否定有什麼作用的更簡單的解釋? – user716468

+0

添加了更多詞語來顯示正在發生的事情。 –

相關問題