我編譯下面的代碼斯卡拉 - 隱方法參數不起作用
def foo(implicit x: Int, x2: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)
但有關參數的數量編譯器的呻吟聲。如果只有參數x
標記爲隱式,爲什麼上述方法會工作,但在此示例中它不起作用?
我編譯下面的代碼斯卡拉 - 隱方法參數不起作用
def foo(implicit x: Int, x2: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)
但有關參數的數量編譯器的呻吟聲。如果只有參數x
標記爲隱式,爲什麼上述方法會工作,但在此示例中它不起作用?
你必須把隱含參數是分開的,自己的括號:
scala> def foo(x2: Int)(implicit x: Int) = println(x2 + x)
scala> implicit val x: Int 2
scala> foo(1)
3
如果你把非隱含參數和隱含參數在同一個括號,你必須明確地傳遞兩個參數,否則編譯器會抱怨爭論的數量錯誤。當Scala編譯器發現參數被標記爲隱式並且沒有顯式傳遞參數時,它將嘗試查找隱式參數。但是編譯器檢查在檢查隱式之前是否已經傳遞了正確數量的參數。
這將工作,只要你想:
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
隱式參數是全部或全無。要麼你明確地通過它們,要麼你沒有通過它們,編譯器會選擇所有的implicits。
在這個例子中,你應該傳遞一個參數給foo
,所以你必須通過一切。如果foo
中只有一個參數,那麼它將工作,因爲參數的數量是正確的(並且該參數將被明確傳遞)。如果您在不傳遞任何參數的情況下致電foo
,則它也將工作,因爲它將爲這兩個參數選擇implicit val x
。