是否有比下面显示的解决方案更简单的解决方案来检查实例是否为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))
你的意思是给定:
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 = .*Functiond+
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测试是一样的