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