Могу ли я повернуть метод, который принимает неявный параметр в функцию?Частично применяя функцию, которая имеет неявный параметр
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), вы не могли бы определить неявное преобразование 'implicit def counterToAsync (c: FileCounter): AsyncFileCounter = c.async', чтобы вы могли еще раз' counter.countFiles ("/") '? –
Ницца! В моем случае неявное преобразование будет проиграно синхронными методами со сходными сигнатурами, которые существуют на содержащем объекте. Тем не менее, это, безусловно, хороший шаблонный способ! Мне действительно нужно проверить, что анализ escape действительно устраняет выделение кучи для объекта Async. – nadavwr
Я бы сказал, что синхронные методы будут иметь другую подпись, так как они не вернут «Будущее [A]», а просто «A», поэтому компилятор вам это может сказать.Вы должны просто разграничить области, где вам нужен асинхронный вызов, и импортировать там неявное преобразование. Что касается исключения выделения кучи, я не могу делать ставку на это ... –