簡體   English   中英

如何在匿名函數中隱式設置多個參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM