在编程语言中,参数传递有多种方式,比如c++中的传递地址和传递数值。在scala中多了一种名称传递
Call-by-Name: => Type
名称传递表示传递的参数名称会替代函数中的参数名称。
我们举个例子
def f(x: => Int) = x * x
=>int表示一个代码块,最终返回Int
通过以下代码调用函数f
var y = 0
f { y += 1; y }
{ y += 1; y }会替代x
{ y += 1; y } * { y += 1; y }
这时会出现一个问题,名称冲突,scala中,函数参数中的标识符名称不能引用或遮盖名称,执行顺序如下。
{ y += 1; y } * { y += 1; y } = 2* {y+=1;y} = 2* 3=6
^
y=2
^
y=3
无参函数 () => Type
这种形式的函数不带有参数, 比如size()返回一个数值. 注意它与匿名函数的区别,虽然它们很相似。
() => println("I'm an anonymous function")
这是一个无参匿名函数,它的类型是Unit
() => Unit
所以我们可以定义一个无参函数
val f: () => Unit = () => println("I'm an anonymous function")
Unit => Type
def f(x: Unit) = ...
call by value
def foo(code : Int) {
println("Parameter already evaluated")
val result = code
println("parameter evaluated : " + result)
}
http://blog.csdn.net/ssjssh/article/details/12126477
https://github.com/vkostyukov/scalacaster