Scala中隐式函数转换与隐式类之间的区别

时间:2015-08-29 13:34:03

标签: scala implicit-conversion

对于Scala中的隐式转换,我可以使用隐式转换函数

implicit def intToX(i:Int):X = new X(i)

1.myMethod // -1

或隐式类

implicit class X(i: Int) {
    def myMethod = - i
}

1.myMethod // -1

这两者有什么区别吗?我什么时候应该更喜欢一个?

有关于implicit conversion vs. type class的相关问题,但它仅比较隐式函数类型类。我感兴趣的是与隐式类的区别。

2 个答案:

答案 0 :(得分:19)

隐式类隐式方法和类的语法糖:

http://docs.scala-lang.org/sips/completed/implicit-classes.html

  

例如,表格的定义:

implicit class RichInt(n: Int) extends Ordered[Int] {
  def min(m: Int): Int = if (n <= m) n else m
  ...
}
     

将由编译器转换如下:

class RichInt(n: Int) extends Ordered[Int] {
  def min(m: Int): Int = if (n <= m) n else m
  ...
}

implicit final def RichInt(n: Int): RichInt = new RichInt(n)
scala 2.10 中添加了

隐式类,因为使用定义隐式方法定义新类非常常见转换为它。

但是,如果您不需要定义新类但定义到现有类的隐式转换,则最好使用隐式方法

答案 1 :(得分:3)

你问了一个问题已经有一段时间了,而且事情似乎发生了变化。实际上,您现在应该总是选择隐式类而非隐式转换。

scala将隐式转换标记为高级语言功能,编译器不鼓励使用它们(至少在Scala push!(out,[t,node,size]); 中)。并且您需要在编译选项中添加一个额外的标志(2.12)以将其关闭。 See scala-lang docs

此外,Scala社区(或至少LightBend / Typesafe人)甚至计划一般地摆脱非确切的转换。这在2017年11月的会议演讲中提到了Scala 2.13,你可以找到它here