È possibile trasformare un metodo che utilizza un parametro implicito in una funzione?Applicazione parziale di una funzione con un parametro implicito
trait Tx
def foo(bar: Any)(implicit tx: Tx) {}
foo _ // error: could not find implicit value for parameter tx: Tx
sto cercando di raggiungere i seguenti, preferibilmente se posso in qualche modo farlo funzionare con la chiamata pianura 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
}
ho trovato this question, tuttavia non si tratta con il passando da metodi a funzioni per quanto posso vedere.
Informazioni sul secondo caso (ad es. FileCounter), non è possibile definire una conversione implicita 'implicit def counterToAsync (c: FileCounter): AsyncFileCounter = c.async' in modo da poter nuovamente" counter.countFiles ("/") '? –
Bello! Nel mio caso la conversione implicita sarà sconfitta da metodi sincroni con firme simili che esistono sull'oggetto contenitore. Tuttavia, è sicuramente un buon rimedio per la caldaia! Ho davvero bisogno di verificare che l'analisi di escape elimini davvero l'allocazione dell'heap per l'oggetto Async, comunque. – nadavwr
Direi che i metodi sincroni avrebbero una firma diversa, dal momento che non restituiranno un 'Future [A]' ma semplicemente un 'A', quindi il compilatore può dirlo.Dovresti semplicemente delimitare gli ambiti in cui hai bisogno della chiamata asincrona e importare lì la conversione implicita. Per quanto riguarda l'allocazione dell'heap, non posso scommettere su questo ... –