В качестве упражнения я попытался создать неявное преобразование, которое приняло бы функцию и произвело Runnable
.Таким образом, вы можете вызывать методы Java, которые принимают 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"))
, не являются допустимым синтаксисом.