2015-04-01 39 views
2

我試圖定義,我想調用函數是一個「默認參數」,與implicit說法:與隱式和非隱含

scala> def f(implicit x: Int, y: String) = y 
f: (implicit x: Int, implicit y: String)String 

注 - 我試圖定義implicit x: Int作爲第二個說法,但我得到了一個編譯時錯誤:

scala> def f(y: String, implicit x: Int) = y 
<console>:1: error: identifier expected but 'implicit' found. 
     def f(y: String, implicit x: Int) = y 

無論如何,我定義implicit Int

scala> implicit val x: Int = 100 
x: Int = 100 

然後我未能調用f只需String說法:

scala> f("foo") 
<console>:10: error: not enough arguments for method f: 
     (implicit x: Int, implicit y: String)String. 
Unspecified value parameter y. 
       f("foo") 
      ^

接下來,我試圖通過指定參數來調用f功能。那也失敗了。

scala> f(y = "foo") 
<console>:10: error: not enough arguments for method f: 
     (implicit x: Int, implicit y: String)String. 
Unspecified value parameter x. 
       f(y = "foo") 
      ^

是否有可能通過提供隱含並提供僅y一個參數調用該函數f

+0

隱含的是完整的參數列表,而不僅僅是一個arguemnt。你需要兩個參數列表:'f(y:String)(implicit x:Int)' – 2015-04-01 20:07:52

回答

3

隱式參數部分是全部或全部 - 要麼顯式傳遞每個參數(假設它們沒有默認值),要麼都不是。你需要,如果你想f("foo")合作,做這樣的事情:

def f(y: String)(implicit x: Int) = y 

我會小心這種方法,雖然 - 我個人越來越傾向於認爲,使用什麼implicits除了類型類的實例是一個不好的主意,並且有一個隱含的價值浮動是有點可怕的。

+0

另外值得注意的是,隱式參數部分總是必須最後一個,並且只能有其中一個(這非常惱人) 。 – 2015-04-01 20:20:18

相關問題