2015-04-01 2 views
2

Я пытаюсь определить, что я думаю, что быть «по умолчанию аргумент», с implicit аргументом:Вызов функции с неявной и Non-неявной

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") 
      ^

Можно ли вызывать функцию f, предоставляя неявное и обеспечивая только один аргумент для y?

+0

неявный для полного списка параметров, а не только одного аргумента. Вам нужно два списка параметров: 'f (y: String) (неявный x: Int)' –

ответ

3

Неявные секции параметров - все или ничего: либо явным образом передаю каждый аргумент (при условии, что они не имеют значений по умолчанию), либо ни один из них. Вам нужно сделать что-то вроде этого, если вы хотите f("foo") работать:

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

я был бы осторожен в этом подходе, хотя-я лично более склонен думать, что использование implicits за все, за исключением экземпляров класса типа плохая идея и наличие неявного значения Int, плавающего вокруг, выглядит пугающе.

+0

Также стоит отметить, что секция неявных параметров всегда должна быть последней и что может быть только один из них (что очень раздражает) , –

Смежные вопросы