Here's a simple Scala call-by-name example. I'll show the normal approach to writing a method and passing in a parameter, and then show a call-by-name (pass by name) example.
1) A "normal" Scala method
Here I show how to pass a parameter to a method "normally", i.e., call by value:
object Test extends App { def time(): Long = { println("In time()") System.nanoTime } def exec(t: Long): Long = { println("Entered exec, calling t ...") println("t = " + t) println("Calling t again ...") t } println(exec(time())) }The output looks like this:
In time() Entered exec, calling t ... t = 1363909521286596000 Calling t again ... 1363909521286596000As expected, the values for
t
are the same. This is because the value oft
is determined when this line is invoked:println(exec(time()))2) A call by name example
Next, make the method parameter a call by name parameter:
object Test extends App { def time() = { println("Entered time() ...") System.nanoTime } // uses a by-name parameter here def exec(t: => Long) = { println("Entered exec, calling t ...") println("t = " + t) println("Calling t again ...") t } println(exec(time())) }This time the output is different:
Entered exec, calling t ... Entered time() ... t = 1363909593759120000 Calling t again ... Entered time() ... 1363909593759480000The two
t
invocations yield different results. As stated in the Scala language specification, this is because:“This indicates that the argument is not evaluated at the point of function application, but instead is evaluated at each use within the function. That is, the argument is evaluated usingcall-by-name.”
That's a simple call by name example in Scala.