scala 值呼叫 名呼叫和控制抽象

2021-09-26 21:13:06 字數 1917 閱讀 8992

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的傳名呼叫...