В качестве упражнения я попытался создать неявное преобразование, которое примет функцию и создаст Runnable
. Таким образом, вы можете вызвать методы Java, которые принимают объекты Runnable
, и использовать их как закрытие.Неявное преобразование в Runnable?
Неявное достаточно легко:
implicit def funToRunnable(fun : Unit) = new Runnable() { def run = fun }
Однако я не знаю, как это назвать. Как вы передаете функцию no-arg, которая возвращает Unit, без ее оценки сразу? Например, я хотел бы, чтобы следующее напечатало «12», но вместо этого печатает «21», потому что print("2")
оценивается сразу.
var savedFun : Runnable = null
def save(r : Runnable) = { savedFun = r }
save(print("2"))
print("1")
savedFun.run()
Как сказать компилятору, чтобы рассматривать print("2")
как тело функции, а не что-то, чтобы быть оценены сразу? Некоторые возможности я старался, такие как
save(() => print("2"))
или
save(=> print("2"))
не являются законным синтаксисом.
вы имели в виду * "методы Java вызовов, которые принимают Runna bles и pass функции в них, как закрытие "*? потому что методы, которые принимают другие функции, не называются замыканиями; функции, которые они принимают, называются (иногда) замыканиями. –