scala 傳名函式和傳值函式

2021-09-08 13:32:44 字數 1043 閱讀 7070

scala的直譯器在解析函式引數(function arguments)時有兩種方式:先計算引數表示式的值(reduce the arguments),再應用到函式內部;或者是將未計算的引數表示式直接應用到函式內部。前者叫做傳值呼叫(call-by-value),後者叫做傳名呼叫(call-by-name)。

object

add

addbyname(2, 2 + 2

) ->2 + (2 + 2

) ->2 + 4

->6

addbyvalue(

2, 2 + 2

) ->addbyvalue(2, 4

) ->2 + 4

->6

可以看出,在進入函式內部前,傳值呼叫方式就已經將引數表示式的值計算完畢,而傳名呼叫是在函式內部進行引數表示式的值計算的。

這就造成了一種現象,每次使用傳名呼叫時,直譯器都會計算一次表示式的值。對於有***(side-effect)的引數來說,這無疑造成了兩種呼叫方式結果的不同。

因此, 在實際的使用中: 

傳值呼叫在進入函式體之前就對引數表示式進行了計算,這避免了函式內部多次使用引數時重複計算其值,在一定程度上提高了效率。

但是傳名呼叫的乙個優勢在於,如果引數在函式體內部沒有被使用到,那麼它就不用計算引數表示式的值了。在這種情況下,傳名呼叫的效率會高一點。

package com.doggie  

object

whyalwaysme

} def main(args: array[string]) =)

delaytime2()

} def delaytime2(t: () => long): unit =

def delaytime(t: => long): unit =

def time() =

}

執行結果: 

Scala 傳值呼叫和傳名呼叫

傳值呼叫時,引數只在呼叫時計算一次,後續重複使用計算的結果 傳名呼叫時,引數在呼叫時不會計算,只有真正用到引數的時候才會計算 x int object scalafunction def printbyname x int unit def printbyvalue x int unit def m...

scala 傳值呼叫,傳名呼叫

scala的直譯器在解析函式引數 function arguments 時有兩種方式 在進入函式內部前,傳值呼叫方式就已經將引數表示式的值計算完畢,而傳名呼叫是在函式內部進行引數表示式的值計算的。這就造成了一種現象,每次使用傳名呼叫時,直譯器都會計算一次表示式的值。傳名呼叫時,接受表示式的形參定義一...

Scala 傳名引數和傳值引數

1 package com.atguigu.chapter0423 object controlabstraction 10 f0 23 11 def f1 int 15f0 f1 1617 2.傳名引數 傳遞 塊 a int 塊的返回值是int型別的 我們可以看到 當f1作為乙個 塊傳入f2時,每...