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

Допустим, я хочу сделать небольшую обертку по направлениям:

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

wrapper {
  println("2")
}

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

Ответы [ 2 ]

24 голосов
/ 17 апреля 2010

Если вы хотите, чтобы ваш wrapper метод выполнял упакованный метод внутри себя, вам следует изменить параметр на «по имени». При этом используется синтаксис => 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
}
1 голос
/ 17 апреля 2010

В вашем случае вы уже выполняете функцию println, а затем передаете результат своей оболочке, пока она ожидает функцию с одним аргументом (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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...