scala - Scala 中的交换运算符定义

标签 scala

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

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

val a: A = new A

这让我可以做 a + 1f ,够简单的。如果我想让lib的用户能够写1f + a怎么办? , 也?我该如何实现?

最佳答案

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

implicit def floatPlusAExtender (x: Float) = 
  new {
    def + (a: A) = a + x
  }

并根据需要使用它。从 Scala 2.10 开始,你最好像这样进行这种转换:
implicit class FloatPlusAExtender (x: Float) {
  def + (a: A) = a + x
}

甚至更好:
implicit class FloatPlusAExtender (val x: Float) extends AnyVal {
  def + (a: A) = a + x
}

最后一种方式叫做Value Class与前两个不同的是,它以零开销提供此功能。 (谢谢,axel22)这也是2.10自带的新东西

或者你可以修改 A像这样:
class A {
  def + (x: Float) = /* ... */
  def +: (x: Float) = this + x
}

并像这样使用它:
1f +: a

最后一种方法更可取。

关于scala - Scala 中的交换运算符定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376545/

相关文章:

scala - 如何在智能IDEA中为Scala自定义代码折叠?

scala - 如何在 Scala 中使类完全不可变

class - Scala classOf与getClass

java - 在 Spark 外部加载 Mllib 模型

Scala 转换为泛型类型(用于泛型数值函数)

scala - 从 Class[A] 中获取 TypeTag[A]

java - 缺少第 3 方库会阻止您使用 Scala 吗?

scala - Scala 中两个 map 的交集和合并/连接

java - 如何将在 iOS 或 Android 上运行的 JavaFX 应用程序连接到 native 库?

performance - sbt 高 CPU 使用率与 ~run