W ramach ćwiczenia próbowałem utworzyć niejawną konwersję, która zaakceptowałaby funkcję i wygenerowała Runnable
. W ten sposób możesz wywoływać metody Java, które akceptują obiekty i używać ich jako zamknięć.Implicit conversion to Runnable?
Domniemana konwersja jest dość prosta:
implicit def funToRunnable(fun : Unit) = new Runnable() { def run = fun }
Jednak nie wiem jak to nazwać. W jaki sposób przekazujesz funkcję no-arg, która zwraca Unit, bez konieczności jednoczesnej oceny? Na przykład, chciałbym, aby poniższe wydrukowały "12", ale zamiast tego wypisują "21", ponieważ print("2")
jest oceniany jednocześnie.
var savedFun : Runnable = null
def save(r : Runnable) = { savedFun = r }
save(print("2"))
print("1")
savedFun.run()
Jak mogę poinformować kompilator traktować print("2")
jako ciało funkcji, a nie coś, aby być oceniane na raz? Niektóre możliwości próbowałem, takie jak
save(() => print("2"))
lub
save(=> print("2"))
nie są składnia prawny.
chodziło * "metody java połączeń, które akceptują Runna przepuszcza i przekazuje im funkcje takie jak zamknięcia "*? ponieważ metody, które akceptują inne funkcje, nie są nazywane zamknięciami; funkcje, które akceptują, są nazywane (czasami) zamknięciami. –