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() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |