加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中所有函数的超类型是什么?

发布时间:2020-12-16 09:06:20 所属栏目:安全 来源:网络整理
导读:我知道我可以对Function1或Function2等进行instanceOf检查,但是有一种通用的方法来查看某些东西是否有效(它可以具有仲裁数量的args).我试着定义这样的东西: type FuncType = (Any*) - Any 但这也不起作用.基本上我有一些看起来像这样的代码: call = (name:
我知道我可以对Function1或Function2等进行instanceOf检查,但是有一种通用的方法来查看某些东西是否有效(它可以具有仲裁数量的args).我试着定义这样的东西:

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)

解决方法

不,没有办法做到这一点,除了通过并检查每个Function1,Function2等.每个特征的父亲是AnyRef,它不会帮助你区别于其他任何东西.每个traits的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!"))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读