1
我在scala中創建了一個組合器分析器。解析樹由評估解析表達式時需要訪問的操作組成。其中一個操作(函數)將通過反射調用另一個對象上的方法,但是當它是可變參數方法時會失敗。無法在scala中調用可變參數方法
這是代碼演示問題:
import scala.reflect.runtime.universe._
class M {
def e: Double = { Math.E }
def add(x: Double, y: Double): Double = { x + y }
def sin(x: Double): Double = { Math.sin(x * Math.PI/180) }
def max(args: Double*): Double = { args.max }
}
sealed trait Action { def visit: Double }
case class Number(value: Double) extends Action { def visit: Double = value }
case class Function(Name: String, Args: Action*) extends Action {
def visit: Double = {
typeOf[M].member(Name: TermName) match {
case NoSymbol => throw new Error(s"Unknown function '$Name'")
case func: Symbol => runtimeMirror(getClass.getClassLoader).reflect(new M).reflectMethod(func.asMethod)(
(for { arg <- Args } yield arg.visit).toList: _*).asInstanceOf[Double]
}
}
}
object Parser {
def main(args: Array[String]) {
// Prints 2.718281828459045
println(Function("e").visit)
// Prints 7.0
println(Function("add", Number(3), Number(4)).visit)
// Prints 1.2246467991473532E-16
println(Function("sin", Number(180)).visit)
// Throws IllegalArgumentException: wrong number of arguments
println(Function("max", Number(1), Number(2.5), Number(50), Number(-3)).visit)
}
}
任何一個想法如何解決這一問題?
哎呀,錯過了位反映的API。 'func'是一個'MethodSymbol',它有'isVarargs'方法。 – rmcuenen