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
tare the same. This is because the value oftis 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
tinvocations 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.
本文通过两个示例对比了Scala中常规参数传递与按名调用的区别。首先介绍了如何使用常规方式调用方法并传递参数,接着展示了按名调用的实现方式,即在每次调用时才进行参数表达式的求值。

被折叠的 条评论
为什么被折叠?



