【发布时间】:2014-05-22 21:58:03
【问题描述】:
Scala 的反射 API 是否提供了一种判断 Scala 对象是否为函数的方法?到目前为止,我想出的最好的是:
import scala.reflect.runtime.universe._
def isFunction[T : TypeTag](x: T) =
weakTypeOf[T] <:< weakTypeOf[Function0[_]] ||
weakTypeOf[T] <:< weakTypeOf[Function1[_,_]] ||
weakTypeOf[T] <:< weakTypeOf[Function2[_,_,_]] ||
weakTypeOf[T] <:< weakTypeOf[Function3[_,_,_,_]] ||
weakTypeOf[T] <:< weakTypeOf[Function4[_,_,_,_,_]] ||
. . .
必须有更好的方法。
【问题讨论】:
-
它们没有共同的超类型,所以不,我认为你不能更简洁地做到这一点。你为什么想知道??
-
我正在编写一个小玩意儿来将函数连接到其他函数,基于它们提供其他函数所需类型值的能力(有点像 make,但是对于值和函数而不是文件和命令)。如果我能说,“这是一个函数吗?好的,它采用什么参数类型,它返回什么类型?”
-
你说的是 Scala 中的
andThen构造吗? -
我可能最终会调用
andThen,但首先我需要查看哪些对象是函数并检查它们的类型签名。或者,嗯,既然你提到了它,也许我可以打电话给andThen,如果出现问题,我可以捕获一个异常……(不,这听起来很麻烦。) -
使用类型系统,而不是反射。
标签: scala reflection