A simple Scala call-by-name example
2016-01-05 16:34
393 查看
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.
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 ...
1363909521286596000
As expected, the values for
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() ...
1363909593759480000
The two
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 ...
1363909521286596000
As expected, the values for
tare the same. This is because the value of
tis 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() ...
1363909593759480000
The 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.
相关文章推荐
- Windows下Scala环境搭建
- Windows7下安装Scala 2.9.2教程
- Scala代码实现列出Hadoop 文件夹下面的所有文件
- ClassNotFoundException:scala.PreDef$
- sbt创建web项目
- XML 文件解析--含Unicode字符的XML文件
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Scala Monad Design Pattern
- Spray.io搭建Rest服务
- Spray.io搭建Rest — 支持Twirl模板并部署
- 搭建hadoop/spark集群环境
- Akka (actors) remote example
- scala工具库
- scala-协变、逆变、上界、下界