暗黙的なパラメータを持つメソッドを関数に変換できますか?暗黙のパラメータを持つ関数を部分的に適用する
trait Tx
def foo(bar: Any)(implicit tx: Tx) {}
foo _ // error: could not find implicit value for parameter tx: Tx
私は何とかそれはプレーンなコールwithSelection(deleteObjects)
で動作させることができ、好ましく場合、以下のことを実現しようとしています:私はしかし、それは扱っていない、this questionを見つけ
trait Test {
def atomic[A](fun: Tx => A): A
def selection: Iterable[Any]
def withSelection(fun: Iterable[Any] => Tx => Unit) {
val sel = selection
if (sel.nonEmpty) atomic { implicit tx =>
fun(sel)(tx)
}
}
object deleteAction {
def apply() {
withSelection(deleteObjects) // !
}
}
def deleteObjects(xs: Iterable[Any])(implicit tx: Tx): Unit
}
私が見る限りでは、方法から機能を持ち上げる。
あなたの2番目のケース(FileCounter)について、暗黙の変換 '暗黙のdef counterToAsync(c:FileCounter):AsyncFileCounter = c.async'を定義できませんでしたので、' counter.countFiles( "/") '? –
ニース!私の場合、暗黙的な変換は、包含するオブジェクトに存在する同様のシグニチャーを持つ同期メソッドによって無効にされます。しかし、それは間違いなく良い定型的な回避策です!私はエスケープ解析がAsyncオブジェクトのヒープ割り当てを実際に排除していることを実際に検証する必要があります。 – nadavwr
私は、同期メソッドは 'Future [A]'を返さず単に 'A'を返さないので、コンパイラがあなたにそれを伝えることができるので、異なる署名を持つと言いたいと思います。非同期呼び出しが必要なスコープを区切り、そこで暗黙の変換をインポートするだけです。ヒープ割り当てを避けるため、私はそれに賭けることはできません... –