我在Scala中为类型类型声明implicit
两种方式(一种比另一种方式少)。
implicit val instance1 = new Typeclass { def do = ??? }
implicit object instance2 extends Typeclass { def do = ??? }
他们有什么不同?在某些时候,人们应该更喜欢一个吗?我发现implicit val
比implicit object
更常用,我还没有找到关于implicit object
的许多资源。
答案 0 :(得分:14)
一个区别是object
版本将被懒惰地初始化,即它的构造函数在第一次使用之前不会被调用。例如:
trait Incrementer[T] {
def inc(x: T)
}
def increment[T](x: T)(implicit ev: Incrementer[T]) = ev.inc(x)
implicit object IntIncrementer extends Incrementer[Int] {
println("IntIncrementer is being constructed...")
def inc(x: Int) = x + 1
}
implicit val DoubleIncrementer extends Incrementer[Double] {
println("DoubleIncrementer is being constructed...")
def inc(x: Double) = x + 1D
}
请注意,在IntIncrementer
使用之前,您不会看到该消息,例如
increment(1) //this prints "IntIncrementer is being constructed..."
但是,DoubleIncrementer
的消息将在定义时显示。因此implicit object
的初始化是惰性的,而implicit val
的初始化是严格的。