有没有办法在运行时重命名Scala(或Java)中的方法?

mep*_*ell 1 java reflection scala

鉴于以下内容:

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
}
Run Code Online (Sandbox Code Playgroud)

有没有办法重命名plus的方法/函数Num+plustimes方法,以*times在运行时这样result = three +- one *- two

在运行时发生这种情况非常重要.如果可能的话,我想避免使用编译器插件.另外,如果适用,我不反对java示例.

我之所以这样做是因为Scala中的默认运算符优先级为three plus one times two8,而three +- one *- two结果为5.

Der*_*att 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

更重要的是,你不能在"运行时"这样做.你期望如何调用在编译时名称不存在的函数?即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)
  }
}
Run Code Online (Sandbox Code Playgroud)