Я попытался объединить неявные аргументы с классами case, но я застрял.
case class C(i: Int)(implicit b: Boolean)
val c1 = C(1)(true)
implicit val b = true
val c2 = C(2)
c1 match {
case C(i)(b) => // doesn´t work
case C(i,b) => // doesn´t work
case C(i) => // works, but wanted: if (b) i else 0
}
В соответствии с Scala Спецификацией языка это связано с созданным компилятором объектом экстрактора для классов case: My implicit Boolean
не является членом результирующего класса case, поэтому он должен быть во втором (неявный ) список аргументов (к сожалению, я не могу найти в методе применения сопутствующего объекта):
Определение класса case
c[tps](ps1 ). . .(psn)
с параметрами типаtps
и значением параметрыps
неявно генерируют объект-экстрактор (§8.1.8), который определяется как следующим образом:
object c {
def apply[tps](ps1 ). . .(psn): c[tps] = new c[Ts](xs1 ). . .(xsn)
def unapply[tps](x: c[tps]) =
if (x eq null) scala.None
else scala.Some(x.xs11, . . . , x.xs1k)
}
Как я могу определить класс case с членами, которые неявно поставляются во время создания?