[英]Scala implicit object vs implicit val
我已经看到两种方式(一种比另一种方式更少)在Scala中声明类型模式的 implicit
。
implicit val instance1 = new Typeclass { def do = ??? }
implicit object instance2 extends Typeclass { def do = ??? }
他们有什么不同? 在某些时候,人们应该更喜欢一个吗? 我发现implicit val
比implicit object
更常用,我还没有找到很多关于implicit object
资源。
一个区别是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
的初始化是严格的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.