给定任何方法,例如
def add(x: Int, y: Int) = {
x + y
}
我可以使用任何检查/反射库来获得add
像arity(add)
之类的东西,因为函数对象似乎没有提供该信息的属性。
答案 0 :(得分:2)
一种类型安全的解决方案是为每个Node
特征重载Function*
构造函数,该特征对应于您将作为参数传递的函数的arity:
scala> class Node {
| def this(f: Function0[Int]) = { this(); println(0) }
| def this(f: Function1[Int, Int]) = { this(); println(1) }
| def this(f: Function2[Int, Int, Int]) = { this(); println(2) }
| }
defined class Node
scala> new Node(add _)
2
res7: Node = Node@427128a6
如果您的情况需要以某种方式采用基于反射的方法,您可以计算所有apply
特征共享的Function*
方法的参数数量,如下所示:
scala> def arity(f: AnyRef): Option[Int] = {
| val apply = f.getClass.getMethods.find(_.getName == "apply")
| apply.map(_.getParameterCount)
| }
arity: (f: AnyRef)Option[Int]
scala> arity(add _)
res0: Option[Int] = Some(2)
或者你可能想考虑使用打字模式:
def arity(f: AnyRef): Int = f match {
case _: Function0[_] => 0
case _: Function1[_, _] => 1
case _: Function2[_, _, _] => 2
...
}