Есть ли способ переименовать методы в Scala (или Java) во время выполнения? - PullRequest
1 голос
/ 09 августа 2011

С учетом следующего:

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 во время выполнения, напримерчто result = three +- one *- two?

Очень важно, чтобы это происходило во время выполнения.Я хотел бы избежать плагинов компилятора, если это возможно.Кроме того, я не против примеров java, если применимо.

Причина, по которой я хотел бы это сделать, заключается в том, что приоритет оператора по умолчанию в Scala для three plus one times two приводит к 8, а three +- one *- two - к 5.

Ответы [ 2 ]

6 голосов
/ 09 августа 2011

Вы предполагаете, что приоритет оператора будет работать, называя вещи так, как вы хотите, и это не сработает.Самый быстрый способ, с помощью которого я могу придумать эту работу, - это сводник, как предложил @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)
  }
}
3 голосов
/ 09 августа 2011

+plus и *times не являются действительными именами Scala. Имена, начинающиеся с не алфавитных символов (кроме _ и $), должны включать только не алфавитные символы.

Кроме того, семантика, которую вы хотите, может быть легко реализована с помощью неявного преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...