views:

73

answers:

2

Let's say I want to make a little wrapper along the lines of:

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

wrapper {
  println("2")
}

Does this make sense? My wrapper method is obviously wrong, but I think the spirit of what I want to do is possible. Am I right in thinking so? If so, what's the solution? Thanks!

+1  A: 

In your case you are already executing the function println and then pass the result to your wrapper while it is expecting a function with one arguments (Any) and that return Any.

Not sure if this answer to your question but you can use a generic type parameter and accept a function with no arguments that return that type:

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
}
Patrick
+6  A: 

If you want your wrapper method to execute the wrapped method inside itself, you should change the parameter to be 'by name'. This uses the syntax => ResultType.

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

You can now do this,

wrapper {
  println("2")
}

and it will print

Executing now
2
Execution finished

If you want to be able to use the return type of the wrapped function, you can make your method generic:

def wrapper[T](f: => T): T = {
  println("Executing now")
  val res: T = f
  println("Execution finished")
  res
}
Ben Lings
Thanks, that works like a charm.
pr1001