Scala中的交换运算符定义

Lan*_*nbo 3 scala

假设我为我的类定义了一些运算符,如下所示:

class A {
    def +(f: Float) = /* ... */
}

val a: A = new A
Run Code Online (Sandbox Code Playgroud)

这让我a + 1f很容易做到.如果我想让lib的用户能够写入1f + a怎么办?我该如何实现呢?

Nik*_*kov 11

在Scala 2.9中,您可以导入此隐式转换:

implicit def floatPlusAExtender (x: Float) = 
  new {
    def + (a: A) = a + x
  }
Run Code Online (Sandbox Code Playgroud)

并按你的意愿使用它.从Scala 2.10开始,你最好这样做:

implicit class FloatPlusAExtender (x: Float) {
  def + (a: A) = a + x
}
Run Code Online (Sandbox Code Playgroud)

或者甚至更好:

implicit class FloatPlusAExtender (val x: Float) extends AnyVal {
  def + (a: A) = a + x
}
Run Code Online (Sandbox Code Playgroud)

最后一种方法称为Value Class,与前两种方式不同,它为此功能提供零开销.(谢谢,axel22)这也是2.10附带的新东西

或者您可以A像这样修改:

class A {
  def + (x: Float) = /* ... */
  def +: (x: Float) = this + x
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

1f +: a
Run Code Online (Sandbox Code Playgroud)

最后一种方法更可取.