有没有一种简单的方法可以检查某些实例是否是Scala中的FunctionX?

时间:2014-07-10 20:07:24

标签: scala reflection types

是否有比下面显示的解决方案更简洁的解决方案来检查实例是否为Function0 / Function1 ......?

 def isFunction(x: Any) = x match {
        case x: Function0[_] => true
        case x: Function1[_,_] => true
        case x: Function2[_,_,_] => true
        case x: Function3[_,_,_,_] => true
        case x: Function4[_,_,_,_,_] => true
        case x: Function5[_,_,_,_,_,_] => true
        case x: Function6[_,_,_,_,_,_,_] => true
        case x: Function7[_,_,_,_,_,_,_,_] => true
        case x: Function8[_,_,_,_,_,_,_,_,_] => true
        case x: Function9[_,_,_,_,_,_,_,_,_,_] => true
        case x: Function10[_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function11[_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function12[_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function13[_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function14[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function15[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function16[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function17[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function18[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function19[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function20[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function21[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case x: Function22[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
        case _ => false
  }


  val x = () => 4

  println(isFunction(x))

1 个答案:

答案 0 :(得分:1)

你的意思是:

scala> val f = (i: Int, j: Int) => i + j
f: (Int, Int) => Int = <function2>

你想说

scala> val r = "scala.*Function\\d+".r
r: scala.util.matching.Regex = .*Function\d+

scala> def test(a: Any): Boolean = { def t(k: Class[_]): Boolean = k.getName match { case r() => true case _ => if (k.getSuperclass != null) t(k.getSuperclass) else false } ; t(a.getClass) }
test: (a: Any)Boolean

scala> test(f)
res1: Boolean = true

这与Tuple test相同。