我可以將一個將隱式參數引入函數的方法嗎?部分應用具有隱式參數的函數
trait Tx
def foo(bar: Any)(implicit tx: Tx) {}
foo _ // error: could not find implicit value for parameter tx: Tx
我想達到以下,最好是如果我能以某種方式使之與普通電話withSelection(deleteObjects)
工作:
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
}
我發現this question,但它不處理就我所能看到的,從方法到功能的提升。
關於你的第二種情況(即FileCounter),你不能定義一個隱式轉換隱式def counterToAsync(c:FileCounter):AsyncFileCounter = c.async',所以你可以再次'counter.countFiles(「/」) '? – 2013-06-08 10:53:36
不錯!在我的情況下,隱式轉換將被包含對象上存在的類似簽名的同步方法擊敗。不過,這絕對是一個很好的模板解決方法!不過,我確實需要驗證轉義分析是否真的消除了Async對象的堆分配。 – nadavwr 2013-06-08 20:29:44
我想說同步方法會有不同的簽名,因爲它們不會返回'Future [A]'而只是'A',所以編譯器可以告訴你。您應該簡單地分隔需要異步調用的範圍,並在其中導入隱式轉換。至於避免堆分配,我不能打賭... – 2013-06-08 22:13:52