Come esercizio, ho provato a creare una conversione implicita che accetta una funzione e produce un Runnable
. In questo modo puoi chiamare i metodi Java che accettano gli oggetti Runnable
e usarli come chiusure.Conversione implicita in Runnable?
La conversione implicita è abbastanza facile:
implicit def funToRunnable(fun : Unit) = new Runnable() { def run = fun }
Tuttavia non so come chiamarlo. Come passi in una funzione no-arg che restituisce l'Unità, senza averla subito valutata? Ad esempio, mi piacerebbe quanto segue per stampare "12", ma invece stampa "21" perché print("2")
viene valutato contemporaneamente.
var savedFun : Runnable = null
def save(r : Runnable) = { savedFun = r }
save(print("2"))
print("1")
savedFun.run()
Come faccio a dire al compilatore di trattare print("2")
come il corpo di una funzione, non è qualcosa che deve essere valutata in una volta? Alcune possibilità che ho provato, come
save(() => print("2"))
o
save(=> print("2"))
non sono la sintassi legale.
si intende * "metodi Java chiamata che accettano runna bles e passare funzioni in loro come chiusure "*? perché i metodi che accettano altre funzioni non sono chiamati chiusure; le funzioni che accettano sono chiamate (a volte) chiusure. –