2012-08-17 80 views
1

我編譯下面的代碼斯卡拉 - 隱方法參數不起作用

def foo(implicit x: Int, x2: Int) = println(x2 + x) 
implicit val x : Int = 2 
foo(1) 

但有關參數的數量編譯器的呻吟聲。如果只有參數x標記爲隱式,爲什麼上述方法會工作,但在此示例中它不起作用?

回答

4

你必須把隱含參數是分開的,自己的括號:

scala> def foo(x2: Int)(implicit x: Int) = println(x2 + x) 
scala> implicit val x: Int 2 
scala> foo(1) 
3 

如果你把非隱含參數和隱含參數在同一個括號,你必須明確地傳遞兩個參數,否則編譯器會抱怨爭論的數量錯誤。當Scala編譯器發現參數被標記爲隱式並且沒有顯式傳遞參數時,它將嘗試查找隱式參數。但是編譯器檢查在檢查隱式之前是否已經傳遞了正確數量的參數。

2

這將工作,只要你想:

def foo(x2: Int)(implicit x: Int) = println(x2 + x) 
implicit val x : Int = 2 
foo(1) 

我不是太深入到Scala的內部及規格,所以我不能給出一個在深度解釋這是爲什麼,但是你必須通過與implicits額外的一套括號。

編輯: 因爲我很好奇,我看了看interwebs。我不會重新鍵入我剛剛找到的所有內容,因此您可以在此處找到更詳細的信息:http://daily-scala.blogspot.de/2010/04/implicit-parameters.html

2

隱式參數是全部或全無。要麼你明確地通過它們,要麼你沒有通過它們,編譯器會選擇所有的implicits。

在這個例子中,你應該傳遞一個參數給foo,所以你必須通過一切。如果foo中只有一個參數,那麼它將工作,因爲參數的數量是正確的(並且該參數將被明確傳遞)。如果您在不傳遞任何參數的情況下致電foo,則它也將工作,因爲它將爲這兩個參數選擇implicit val x