我什么时候应该使用隐式类?

时间:2018-01-18 12:55:44

标签: scala implicit

对我来说,我会在以下场景中使用隐式类:

  • 无法访问基础类型,无法添加我想要的方法。
  • 我想要的方法在“全球”意义上没有意义。
  • 我将功能拆分为另一个“扩展”库
  • 实际上转换为新类型会增加语义/可读性值(新类型实际上意味着什么)

但是,我对Scala相当新(< 6个月),我注意到我周围的开发人员在打破上述场景时正在使用隐式类。当我问为什么时,答案是“因为这就是我一直以来所做的”。

所以我的问题是,是否有官方建议何时应该使用隐式类而不是添加到类定义的普通函数? (我在这里找不到任何东西:https://docs.scala-lang.org/overviews/core/implicit-classes.html

2 个答案:

答案 0 :(得分:1)

根据SIP

隐式类的动机是在Scala中使用了流行的扩展方法模式(有时称为Pimp My Library pattern)来扩展预先存在的类,使用新的方法,字段和接口。 还有另一个常见的“扩展”用例,称为类型特征或type classes(请参阅scala.math.Numeric)。类型类提供了纯继承层次结构的替代方法,它与扩展方法模式非常相似。 这两种技术的主要缺点是它们在每次调用时都会产生额外的对象以获得方便的语法。这使得这些有用的模式不适合用于性能关键代码。在这些情况下,通常会删除模式的使用并使用具有静态辅助方法的对象。

因此添加了隐式类语法来解决这些问题。

答案 1 :(得分:0)

摇滚乐。他们允许制作自己的DSL。看一下Spray代码,这是我们经典和受欢迎的项目之一:

trait TransformerPipelineSupport {
  ...
  implicit class WithTransformation[A](value: A) {
    def ~>[B](f: A ⇒ B): B = f(value)
  }
  ...
}

〜>允许编写Spray指令......还有更多的例子