如何使用 Any* 的参数列表将任意方法调用为 Any 类型?
How to call arbitrary method as Any type with argument list of Any*?
假设 method 是一个函数,可以在 arguments 中获取参数数量,我将如何在 Scala 中实现以下方法?
def applyAny(method: Any, arguments: Any*) = ???
我的预期用途是与 scala.Dynamic 结合使用,例如:
val dynamicValue: Dynamic
dynamicValue.myAdd = (x,y) = > x + y
dynamicValue.myAdd(2,3)
我从您的示例片段中了解到,您希望这些 "methods" 成为 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
在各个地方的运行时有很多机会。
假设 method 是一个函数,可以在 arguments 中获取参数数量,我将如何在 Scala 中实现以下方法?
def applyAny(method: Any, arguments: Any*) = ???
我的预期用途是与 scala.Dynamic 结合使用,例如:
val dynamicValue: Dynamic
dynamicValue.myAdd = (x,y) = > x + y
dynamicValue.myAdd(2,3)
我从您的示例片段中了解到,您希望这些 "methods" 成为 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
在各个地方的运行时有很多机会。