我已经看到了两种方法(一种比另一种少),可以在Scala中为类型类模式声明implicit
。
implicit val instance1 = new Typeclass { def do = ??? }
implicit object instance2 extends Typeclass { def do = ??? }
它们有什么不同?在特定的时间里,一个人应该选择一个而不是另一个?我发现implicit val
比implicit object
更常用,而且我还没有找到很多关于implicit object
的资源。
发布于 2015-10-25 02:30:38
一个不同之处在于,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
的初始化是严格的。
https://stackoverflow.com/questions/33317974
复制相似问题