Скажем, я хочу сделать немного обертки вроде:
def wrapper(f: (Any) => Any): Any = {
println("Executing now")
val res = f
println("Execution finished")
res
}
wrapper {
println("2")
}
Это имеет смысл? Мой метод обертки является, очевидно, неправильным, но я думаю дух того, что я хочу сделать, возможно. Действительно ли я прав в размышлении так? Если так, каково решение?Спасибо!
Если вы хотите, чтобы ваш метод оболочки
выполнял обернутый метод внутри себя, вы должны изменить параметр на «по имени». Здесь используется синтаксис => ResultType
.
def wrapper(f: => Any): Any = {
println("Executing now")
val res = f
println("Execution finished")
res
}
Теперь вы можете сделать это,
wrapper {
println("2")
}
, и он напечатает
Executing now
2
Execution finished
Если вы хотите иметь возможность использовать тип возвращаемого значения обернутой функции, вы можете сделать свой метод универсальным:
def wrapper[T](f: => T): T = {
println("Executing now")
val res: T = f
println("Execution finished")
res
}
В вашем случае вы уже выполняете функцию println
, а затем передаете результат вашей оболочке, пока она ожидает функцию с одним arguments ( Any
) и возвращают Any
.
Не уверен, что это ответ на ваш вопрос, но вы можете использовать параметр универсального типа и принять функцию без аргументов, возвращающих этот тип:
def wrapper[T](f: () => T) = {
println("Executing now")
val res = f() // call the function
println("Execution finished")
res
}
wrapper {
()=>println("2") // create an anonymous function that will be called
}