Почему этот пример неявного параметра в Scala не работает? - PullRequest
8 голосов
/ 25 апреля 2010

простой тест REPL ...

def g(a:Int)(implicit b:Int) = {a+b}

Почему ни одно из этих попыток не работает?

1

scala> class A { var b:Int =8; var c = g(2) }
:6: error: could not find implicit value for parameter b: Int
       class A { var b:Int =8; var c = g(2) }

2

scala> class A(var b:Int) { var c = g(2) }  
:6: error: could not find implicit value for parameter b: Int
       class A(var b:Int) { var c = g(2) }
                                     ^

Спасибо

Ответы [ 2 ]

14 голосов
/ 25 апреля 2010

вам нужно определить b как неявное в A

scala> def g(a:Int)(implicit b:Int) = {a+b}
g: (a: Int)(implicit b: Int)Int

scala> class A { implicit var b:Int =8; var c = g(2) }
defined class A

scala> val a = new A
a: A = A@1f7dbd8

scala> a.c
res3: Int = 10

В общем случае будут рассматриваться только те значения / методы, которые определены как косвенные, и их поиск выполняется в области видимости или в сопутствующем объектетребуемый тип (в данном случае Int)

6 голосов
/ 25 апреля 2010

Вы должны указать, какой var или val будет использоваться в качестве неявного значения:

scala> def g(a:Int)(implicit b:Int) = {a+b}
g: (a: Int)(implicit b: Int)Int

scala> class A {  implicit var b:Int =8; var c = g(2) }
defined class A

scala> new A
res0: A = A@16b18b6

scala> res0.c
res1: Int = 10

scala> class A(implicit var b:Int) { var c = g(2) }
defined class A
...