聊聊JavaScript和Scala的表示式 Expression

i042416發表於2018-09-03

我們先看下面這段簡單的JavaScript程式碼。

我在第10行呼叫了函式f,其中傳入的第二個和第三個引數都是一個逗號表示式。

函式f的實現,會檢查這兩個引數的型別,如果是函式,則執行函式呼叫,再列印其返回值,否則直接列印傳入的表示式的值。

聊聊JavaScript和Scala的表示式 Expression

執行上面這段程式碼,列印輸出如下:

聊聊JavaScript和Scala的表示式 Expression

我們可以看出,雖然傳入的第一個引數為true,導致函式f內部只會列印第二個引數y代表的表示式的值,5,但是第三個引數代表的表示式在函式f呼叫時,也進行了表示式求值,所以最後console也輸出了Big calculation2。

如果我們想實現所謂的“惰性求值”,有時候也稱”惰性計算“,那麼只需要將原本寫在表示式位置的邏輯用一個JavaScript函式包裹起來,如下:

聊聊JavaScript和Scala的表示式 Expression

再次呼叫f,此時傳入的引數y和z的型別為函式,因此在f進行呼叫時,同之前傳入的表示式不同,這裡並不會即時呼叫y和z代表的函式。列印輸出:

聊聊JavaScript和Scala的表示式 Expression

我們再來看看Scala關於表示式的處理是否和JavaScript一致。

Scala 是一門多正規化(multi-paradigm)的程式語言,設計初衷是要整合物件導向程式設計和函數語言程式設計的各種特性。

Scala 執行在Java虛擬機器上,併相容現有的Java程式。

Scala 原始碼被編譯成Java位元組碼,所以它可以執行於JVM之上,並可以呼叫現有的Java類庫。

聊聊JavaScript和Scala的表示式 Expression

下圖第5行和第12行我分別定義了兩個Scala函式exp_test1和exp_test2, 邏輯和之前的JavaScript函式f類似。

exp_test1接受的第二個和第三個引數型別為exp1 :=> Unit,意思是需要傳入一個表示式,這個表示式的返回型別是Unit。

exp_test2接收的第二個和第三個引數型別為exp1() :=> Unit,意思是需要傳入一個函式,這個函式沒有任何輸入引數,函式的返回型別是Unit。

聊聊JavaScript和Scala的表示式 Expression

第19行到第25行是對這兩個函式的各種測試,列印輸出:

聊聊JavaScript和Scala的表示式 Expression

可以看到,即使傳入兩個函式exp_test1和exp_test2的第二個和第三個引數都是表示式,Scala也能做到對錶達式的惰性求值:

第19行和第20行的函式呼叫,第三個引數位置的表示式和函式都沒有即時求值,而是惰性求值。

第22行和第23行的函式呼叫,第二個引數位置的表示式和函式都沒有即時求值,而是惰性求值。

這個小例子說明了不同的程式語言,對於函式呼叫的表示式求值方式可能採取了不同的實現:惰性求值或者即時求值。

聊聊JavaScript和Scala的表示式 Expression

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:


聊聊JavaScript和Scala的表示式 Expression

聊聊JavaScript和Scala的表示式 Expression


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章