首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala隐式对象与隐式值

Scala隐式对象与隐式值
EN

Stack Overflow用户
提问于 2015-10-24 20:04:04
回答 1查看 3K关注 0票数 21

我已经看到了两种方法(一种比另一种少),可以在Scala中为类型类模式声明implicit

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

它们有什么不同?在特定的时间里,一个人应该选择一个而不是另一个?我发现implicit valimplicit object更常用,而且我还没有找到很多关于implicit object的资源。

EN

回答 1

Stack Overflow用户

发布于 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的初始化是严格的。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33317974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档