假设我为我的类定义了一些运算符,如下所示:
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/