检查方法对象的arity

时间:2017-10-24 22:20:41

标签: scala

给定任何方法,例如

def add(x: Int, y: Int) = {
    x + y
}

我可以使用任何检查/反射库来获得add

的arity

arity(add)之类的东西,因为函数对象似乎没有提供该信息的属性。

1 个答案:

答案 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
  ...
}