3

我知道我可以对or等​​进行instanceOf检查,但是有没有一种通用的方法来查看某些东西是否正常运行(它可以有任意数量的 args)。我尝试定义这样的东西:Function1Function2

type FuncType = (Any*) -> Any

但这也不起作用。基本上我有一些看起来像这样的代码:

call = (name: Any, args: Any*) -> if name.isFunction then name.castAs[Function].apply(args) else name
aFunction = (name: String) => "Hello " + name
notAFunction = "Hello rick"
call(aFunction, "rick")
call(notAFunction)
4

2 回答 2

4

所有函数类型都没有通用超类型。

Scala 无法抽象出函数的数量。但是,您可能会查看Shapeless库,它引入了一种称为 an 的东西HList,您可以使用它来抽象函数的数量。

但是,我认为这并不是您真正需要的。听起来你只想做一个检查,比如“这是一个函数吗?” 您可能认为没有与 arity 无关的Function超类型很奇怪,但如果您想对函数做一些有用的事情,您几乎总是需要知道函数的 arity。

或者,您可以使用curried函数上的方法做一些事情,这将返回一个Function1.

于 2013-08-31T04:52:37.930 回答
3

不,没有办法做到这一点,除了检查每个Function1,Function2等。这些特征中的每一个的父级是AnyRef,这不会帮助您将它们与其他任何东西区分开来。这些apply特征中的每一个的方法都采用不同数量的参数,因此无法为它们提供具有 apply 方法的父级。您可能最接近您正在尝试做的事情是:

def arbitraryFunction(function: AnyRef, args: Seq[Any]): Any = {
  function match {
    case f: Function1[Any, Any] => f(args(0))
    case f: Function2[Any, Any, Any] => f(args(0), args(1))
    // and so on
  }
}

但这是疯狂和危险的,如果类型错误,将在运行时抛出异常,例如

arbitraryFunction((x: Int) => x * 2, List("I'm a String!"))
于 2013-08-31T04:55:59.900 回答