scala 擁有兩種引數傳遞的方式:按值傳遞
與按名傳遞
。按值傳遞
避免了引數的重複求值,效率相對較高;而按名傳遞
避免了在函式呼叫時刻的引數求值,而將求值推延至實際呼叫點,但有可能造成重複的表示式求值。
值傳遞:先計算引數表示式的值,再應用到函式內部;
def main
(args: array[string]
): unit =
foo(f(
))}def foo
(a: int)
=
執行結果:
f...
1010
10
說明:呼叫foo(f())
方法時,會首先呼叫並執行 函式f
中的**,並將最後的返回值:10
傳遞給foo(a: int)
方法 ,所以f...
執行一次,10
執行 三次
名傳遞:將未計算的引數表示式直接應用到函式內部
def main
(args: array[string]
): unit =
foo(f(
))}def foo
(a:=
> int)
=
執行結果:
f...
10f...
10f...
10
說明:foo(a: => int)
方法中增加了=>
表示名傳遞
,呼叫foo(a: => int)
方法時, 會將 函式f
整個傳遞給foo(a: => int)
方法,在 該方法中,每次println(a)
都會執行被完整傳遞過來的函式
,所以println 一下 列印一次 f... 和 10
在上述名傳遞例子中, 呼叫foo
方法時需要傳入另乙個函式
,所以我們需要額外定義乙個具名函式,而名傳遞的本質是:傳遞函式本身,所以這個步驟下面精簡一下
def main
(args: array[string]
): unit =
// foo(f2())
// 第一次精簡
// 這裡直接傳遞乙個匿名函式
// foo(() => )
// 第二次精簡
//foo的呼叫還可以將匿名函式的部分省略成
// foo()
//第三次精簡
// 還可以省略
foo}def foo
(a:=
> int)
=
執行結果:
匿名函式...
10匿名函式...
10匿名函式...
10
抽象控制
def main
(args: array[string]
): unit =
}def mywhile
(flag:
=> boolean)
(exp:
=> unit)
: unit =
else
println
("迴圈結束...."
)}
Scala 傳值呼叫和傳名呼叫
傳值呼叫時,引數只在呼叫時計算一次,後續重複使用計算的結果 傳名呼叫時,引數在呼叫時不會計算,只有真正用到引數的時候才會計算 x int object scalafunction def printbyname x int unit def printbyvalue x int unit def m...
scala 傳值呼叫,傳名呼叫
scala的直譯器在解析函式引數 function arguments 時有兩種方式 在進入函式內部前,傳值呼叫方式就已經將引數表示式的值計算完畢,而傳名呼叫是在函式內部進行引數表示式的值計算的。這就造成了一種現象,每次使用傳名呼叫時,直譯器都會計算一次表示式的值。傳名呼叫時,接受表示式的形參定義一...
Scala的傳值呼叫與傳名呼叫理解
通常函式 方法的引數是傳值引數,也就是說,引數的值在傳遞給函式之前已經確定好了。而在scala中,方法或函式的引數可以是乙個表示式,也就是可以將乙個 邏輯傳遞給某個方法或著函式。這有點像c語言 1.scala的傳值呼叫 call by value 引數是乙個或多個型別的變數 2.scala的傳名呼叫...