Как я могу взять какую-либо функцию в качестве входа для моего метода обертки Scala?

Скажем, я хочу сделать немного обертки вроде:

def wrapper(f: (Any) => Any): Any = {
  println("Executing now")
  val res = f
  println("Execution finished")
  res
}

wrapper {
  println("2")
}

Это имеет смысл? Мой метод обертки является, очевидно, неправильным, но я думаю дух того, что я хочу сделать, возможно. Действительно ли я прав в размышлении так? Если так, каково решение?Спасибо!

10
задан pr1001 17 April 2010 в 09:45
поделиться

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
}
25
ответ дан 3 December 2019 в 16:09
поделиться

В вашем случае вы уже выполняете функцию 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
}
1
ответ дан 3 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: