繁体   English   中英

Scala隐式对象vs隐式val

[英]Scala implicit object vs implicit val

我已经看到两种方式(一种比另一种方式更少)在Scala中声明类型模式的 implicit

implicit val instance1 = new Typeclass { def do = ??? }
implicit object instance2 extends Typeclass { def do = ??? }

他们有什么不同? 在某些时候,人们应该更喜欢一个吗? 我发现implicit valimplicit 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM