引数の値渡しと名前渡し

値渡しと名前渡しとは?

関数の引数渡しの方式で、
実引数を評価した結果を仮引数に渡すのが値渡し(普通に渡すのと同じ)
実引数を評価せず、値が必要になるまで評価を待つのが名前渡し
という。

宣言のしかた

値渡し

仮引数名: 型名

名前渡し

仮引数名: => 型名

コードを実行してみてみる。

値渡し
var i = 0
def f(a: Int) = {
    print("A:" + a)
    i = 5
    print("B:" + b)
}
f(5 + i) //ここの時点で評価される

実行結果は
A:5
B:5
となる。
これは実引数(5 + i)が計算された5が仮引数として渡されているから
A:を出力したあとにiに5を代入しても、B:は5のままになる

名前渡し
var i = 0
def f(a: => Int) = {
    print("A:" + a)  //ここで評価される
    i = 5
    print("B:" + b)  //ここで評価される
}
f(5 + i)

実行結果は
A:5
B:10
となる。
これは、実引数が評価されずに仮引数が(5 + i)として渡されて、
print("A:" + a)で評価される。
iに5を代入した後、
print("B:" + a)で評価されるので、5 + 5で10と出力される。

なるほどね〜〜。