如果方法是一个可以接受参数中的参数数量的函数,我将如何在Scala中实现以下方法?
def applyAny(method: Any, arguments: Any*) = ???
我的目的是与scala.Dynamic结合使用,如下所示:
val dynamicValue: Dynamic
dynamicValue.myAdd = (x,y) = > x + y
dynamicValue.myAdd(2,3)
答案 0 :(得分:1)
我从您的示例代码段中获取它,您希望这些“方法”成为23种FunctionN
类型之一。
在这种情况下,除了在上述23种类型上使用运行时调度之外,你无能为力:
def applyAny(method: Any, arguments: Any*): Any = (arguments.size, method) match {
case (0, f: Function0[_]) =>
f()
case (1, f: Function1[_, _]) =>
f.asInstanceOf[Function1[Any, Any]](arguments(0))
case (2, f: Function2[_, _, _]) =>
f.asInstanceOf[Function2[Any, Any, Any]](arguments(0), arguments(1))
...
case (22, f: Function22[_, _, ..., _]) =>
f.asInstanceOf[Function22[Any, Any, ..., Any]](arguments(0), arguments(1), ..., arguments(21))
case _ =>
sys.error("Arity mismatch")
}
并不漂亮,并且ClassCastException
在运行时在各个地方都有很多机会。