鉴于以下内容:
case class Num(value: Double) {
def plus(rhs: Num) = Num(value + rhs.value)
def times(rhs: Num) = Num(value * rhs.value)
}
object TestApp extends App {
// ** maybe do something here
val one = Num(1)
val two = Num(2)
val three = Num(3)
val result = three plus one times two
}
有没有办法在运行时将plus
中的Num
方法/函数重命名为+plus
,将times
方法重命名为*times
,以便{{} 1}}?
这在运行时发生非常重要。如果可能的话,我想避免使用编译器插件。另外,如果适用,我不反对java示例。
我之所以这样做是因为Scala中result = three +- one *- two
的默认运算符优先级为8,而three plus one times two
的结果为5。
答案 0 :(得分:6)
您假设运算符优先级将按照您想要的方式命名,并且不会起作用。正如@Dave Griffith建议的那样,我能想到的最快的方法就是用皮条客,
case class Num(value: Double)
object Main {
implicit def toDouble(v: Num) = v.value
implicit def toNum(v: Double) = Num(v)
def main(args: Array[String]) {
val one = Num(1)
val two = Num(2)
val three = Num(3)
val result: Num = three + one * two
println(result)
}
}
更重要的是,您无法在“运行时”执行此操作。你期望如何调用在编译时名称不存在的函数?即Num.+plus
其中Num
没有+plus
方法?编译器会告诉你迷路。并且,如前所述,+plus
无论如何都无效。
编辑:我今天再次看到这个,我不确定我在抽烟。一个更好的皮条客是:
class NumMath(u: Num) {
def +(v: Num) = Num(u.value + v.value)
def *(v: Num) = Num(u.value * v.value)
}
object Num {
implicit def toNumMath(v: Num) = new NumMath(v)
}
case class Num(value: Double)
object Main {
import Num._
def main(args: Array[String]) {
val one = Num(1)
val two = Num(2)
val three = Num(3)
val result = three + one * two
println(result)
}
}
答案 1 :(得分:3)
+plus
和*times
不是有效的Scala名称。以非字母字符(非_和$)开头的名称必须仅包含非字母字符。
除此之外,您可以通过隐式转换轻松完成所需的语义。