![](/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.