是否有在运行时重命名Scala(或Java)中的方法的方法



考虑到以下内容:

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
}

是否有办法在运行时将Num中的plus方法/函数重命名为+plus,将times方法重命名为*times,从而使result = three +- one *- two ?

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

我想这样做的原因是因为Scala中three plus one times two的默认操作符优先级为8,而three +- one *- two的结果为5。

你假设操作符优先级可以通过你想要的方式命名,这是行不通的。我能想到的最快的方法就是找个皮条客,就像@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)
  }
}

+plus*times不是有效的Scala名称。以非字母字符(_和$除外)开头的名称必须只包含非字母字符。

除此之外,您想要的语义可以通过隐式转换轻松完成。

相关内容

  • 没有找到相关文章

最新更新