Если у вашего метода много неявных параметров (у меня иногда есть в моих проектах), и иногда вы хотите просто указать один из них явно, а остальные разрешить неявно, вы можете написать implicitly для каждого другого параметра, как показано в моем другом ответе. Но иногда вы измените сигнатуру этого метода или явный параметр находится в середине этого списка параметров, тогда вы можете сделать более читаемый клиентский код со следующей конструкцией:
Предположим, у вас есть несколько типов и их неявные фиктивные объекты:
trait I1; implicit object I1 extends I1
trait I2; implicit object I2 extends I2
trait I3; implicit object I3 extends I3
trait I4; implicit object I4 extends I4
trait I5; implicit object I5 extends I5
trait I6; implicit object I6 extends I6
Теперь у вас есть метод foo1, который использует следующие имплициты:
def foo1(implicit i1: I1, i2: I2, i3: I3, i4: I4, i5: I5, i6: I6) {
println(i1, i2, i3, i4, i5, i6)
}
Теперь вы часто хотите явно указать i4: I4. Итак, вы пишете:
val i4 = new I4 {}
foo1(implicitly, implicitly, implicitly, i4, implicitly, implicitly)
Уродливо!
Со следующей (должна быть помещена в область действия метода foo2 и, возможно, переименована) оболочка для всех имплицитов:
object Implicits {
def apply(i4: I4)(implicit i1: I1, i2: I2, i3: I3, i5: I5, i6: I6) = new Implicits(i1, i2, i3, i4, i5, i6)
implicit def applying(implicit i1: I1, i2: I2, i3: I3, i4: I4, i5: I5, i6: I6) = new Implicits(i1, i2, i3, i4, i5, i6)
}
class Implicits(val i1: I1, val i2: I2, val i3: I3, val i4: I4, val i5: I5, val i6: I6)
и связанный метод foo2:
def foo2(implicit implicits: Implicits) = {
import implicits._
println(i1, i2, i3, i4, i5, i6)
}
теперь вы можете вызывать foo2 вместо foo1 следующим образом:
locally {
foo2 // using implicit dummy objects I1, ..., I6 from above
// or with explicit I4:
val i4 = new I4 {}
foo2(Implicits(i4))
}
person
Peter Schmitz
schedule
21.03.2014
implicit val a = 33; foo(b = "hello"). Не могу представить случая, когда это было бы проблематично. - person 0__   schedule 17.09.2014