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