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

scala – 如何使两个函数参数成为隐式

发布时间:2020-12-16 09:49:13 所属栏目:安全 来源:网络整理
导读:假设我们有Object作为apply方法的参数: object Wrapper { def apply(block: TypeA = String) = { TypeA a = ... block(a) }} TypeA是域类型的应用程序. 现在,当我定义内联块时,我可以将TypeA参数定义为隐式: Wrapper { implicit a = functionThatUseImplic
假设我们有Object作为apply方法的参数:

object Wrapper {
  def apply(block: TypeA => String) = {
    TypeA a = ...
    block(a)
  }
}

TypeA是域类型的应用程序.

现在,当我定义内联块时,我可以将TypeA参数定义为隐式:

Wrapper { implicit a => functionThatUseImplicitA() }

但是如果块参数不是Function1,而是Function2呢?如何将两个参数定义为隐式?

object Wrapper2 {
  def apply(block: (TypeA,TypeB) => String) = {
    TypeA a = ...
    TypeB b = ...
    block(a,b)
  }
}

这个不起作用:

Wrapper { implicit (a,b) => functionThatUseImplicitAB() }

唯一的解决方法是将它们定义为val:

Wrapper { (a,b) => 
  implicit val ia = a
  implicit val ib = b
  functionThatUseImplicitAB()
}

谢谢!

解决方法

根据 SLS 6.23
匿名函数隐式关键字仅允许用于单个参数函数:

Expr ::= (Bindings | [‘ implicit ’] id | ‘_’) ‘=>’ Expr
ResultExpr ::= (Bindings | ([‘ implicit ’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block

所以你不能把两个函数参数作为隐式.

这是使用curried函数的原因之一:

object Wrapper {
  def apply(block: TypeA => TypeB => String) = ???
}

Wrapper { implicit a => implicit b =>
  functionThatUseImplicitAB()
}

(编辑:李大同)

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

    推荐文章
      热点阅读