![](/img/trans.png)
[英]How do you create scala anonymous function with multiple implicit parameters
[英]How can I make multiple parameters in an anonymous function implicit?
如果我们有一个接受匿名函数A => B
作为参数的方法,则可以在调用中使A
隐含。
def impl(a: Int)(f: Int => Int): Int = f(a)
impl(a) { implicit z =>
...
}
但是我们可以使用具有多个参数的匿名函数来做到这一点吗?
def impl(a: Int, b: Int)(f: (Int, Int) => Int): Int = f(a, b)
理想情况下,这将类似于:
impl(1, 2) { implicit (a, b) => // wrong
...
}
要么
impl(1, 2) { (implicit a, implicit b) => // also wrong
...
}
我可以使用A => B => C
来解决此问题:
def impl(a: Int, b: Int)(f: Int => Int => Int): Int = f(a)(b)
impl(1, 2) { implicit a => implicit b =>
...
}
但是,有没有一种方法可以不使用任何功能呢?
应该很明显,但是Int
在这里只是一个虚拟的占位符。
不,不可能。 根据规范的6.23节“ 匿名函数 ”,匿名函数语法为:
Expr ::= (Bindings | ['implicit'] id | '_') '=>' Expr
ResultExpr ::= (Bindings | (['implicit'] id | '_') ':' CompoundType) '=>' Block
Bindings ::= '(' Binding {',' Binding} ')'
Binding ::= (id | '_') [':' Type]
如您所见, implicit
大小写是特殊情况,只有1个标识符,而重复式大小写Bindings
(使用EBNF的重复语法{...}
)则排除了implicit
使用。
本节中唯一为implicit
添加的详细信息是:
匿名函数的命名参数可以选择前面带有隐式修饰符。 在这种情况下,该参数被标记为隐式; 但是,参数部分本身在这里定义的意义上不算作隐式参数部分。 因此,必须始终明确给出匿名函数的参数。
我认为该文本还应阐明这仅适用于单个参数(例如“具有1个参数的匿名函数的命名参数...”)
当然,最简单的解决方法是避开语法糖,并将匿名函数参数重新绑定到新的隐式变量:
impl(a) { (b, c) =>
implicit val (impB, imbC) = (b, c)
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.