聊聊JavaScript和Scala的表示式 Expression
我們先看下面這段簡單的JavaScript程式碼。
我在第10行呼叫了函式f,其中傳入的第二個和第三個引數都是一個逗號表示式。
函式f的實現,會檢查這兩個引數的型別,如果是函式,則執行函式呼叫,再列印其返回值,否則直接列印傳入的表示式的值。
執行上面這段程式碼,列印輸出如下:
我們可以看出,雖然傳入的第一個引數為true,導致函式f內部只會列印第二個引數y代表的表示式的值,5,但是第三個引數代表的表示式在函式f呼叫時,也進行了表示式求值,所以最後console也輸出了Big calculation2。
如果我們想實現所謂的“惰性求值”,有時候也稱”惰性計算“,那麼只需要將原本寫在表示式位置的邏輯用一個JavaScript函式包裹起來,如下:
再次呼叫f,此時傳入的引數y和z的型別為函式,因此在f進行呼叫時,同之前傳入的表示式不同,這裡並不會即時呼叫y和z代表的函式。列印輸出:
我們再來看看Scala關於表示式的處理是否和JavaScript一致。
Scala 是一門多正規化(multi-paradigm)的程式語言,設計初衷是要整合物件導向程式設計和函數語言程式設計的各種特性。
Scala 執行在Java虛擬機器上,併相容現有的Java程式。
Scala 原始碼被編譯成Java位元組碼,所以它可以執行於JVM之上,並可以呼叫現有的Java類庫。
下圖第5行和第12行我分別定義了兩個Scala函式exp_test1和exp_test2, 邏輯和之前的JavaScript函式f類似。
exp_test1接受的第二個和第三個引數型別為exp1 :=> Unit,意思是需要傳入一個表示式,這個表示式的返回型別是Unit。
exp_test2接收的第二個和第三個引數型別為exp1() :=> Unit,意思是需要傳入一個函式,這個函式沒有任何輸入引數,函式的返回型別是Unit。
第19行到第25行是對這兩個函式的各種測試,列印輸出:
可以看到,即使傳入兩個函式exp_test1和exp_test2的第二個和第三個引數都是表示式,Scala也能做到對錶達式的惰性求值:
第19行和第20行的函式呼叫,第三個引數位置的表示式和函式都沒有即時求值,而是惰性求值。
第22行和第23行的函式呼叫,第二個引數位置的表示式和函式都沒有即時求值,而是惰性求值。
這個小例子說明了不同的程式語言,對於函式呼叫的表示式求值方式可能採取了不同的實現:惰性求值或者即時求值。
要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213441/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ABAP mesh表示式, JavaScript和Scala的 expressionJavaScriptExpress
- 動態拼接表示式——ExpressionExpress
- 正規表示式(regular expression)Express
- Scala的for表示式進階
- Oracle正規表示式(regular expression)OracleExpress
- oracle中的正規表示式(regular expression)OracleExpress
- 【c#表示式樹】最完善的表示式樹Expression.Dynamic的玩法C#Express
- 05.表示式目錄樹ExpressionExpress
- 正規表示式regular expression詳述Express
- vi 中的正規表示式 (Regular Expression)(轉)Express
- Scala中的單例以及鏈式表示式單例
- [C# Expression] 之動態建立表示式C#Express
- IIFE (Imdiately Invoked Function Expression 立即執行的函式表示式)FunctionExpress函式
- JavaScript表示式和運算子(轉)JavaScript
- [CareerCup] 9.11 Parenthesize the Expression 表示式加括號Express
- oracle的正規表示式(regular expression)簡單介紹OracleExpress
- 聊聊 scala 的模式匹配模式
- JavaScript 表示式JavaScript
- JavaScript表示式JavaScript
- JavaScript函式宣告和函式表示式區別JavaScript函式
- [Shell] awk學習(3)-regular expression 正規表示式Express
- Lambda表示式之爭:Scala vs Java 8Java
- Java 8 vs. Scala(一): Lambda表示式Java
- JavaScript的正規表示式JavaScript
- JavaScript短路表示式JavaScript
- [LeetCode] Regular Expression Matching 正規表示式匹配LeetCodeExpress
- POJ-3337 Expression Evaluator-表示式求值Express
- 分享開源表示式解析器IK-Expression2.0Express
- javascript-函式表示式JavaScript函式
- JavaScript中正規表示式的使用JavaScript
- scala 函式和方法函式
- [CareerCup] 5.4 Explain Expression ((n & (n-1)) == 0) 解釋表示式AIExpress
- 【JavaScript】正規表示式JavaScript
- javascript正規表示式JavaScript
- javascript–正規表示式JavaScript
- JavaScript 正規表示式JavaScript
- JavaScript權威指南(4)——表示式和運算子JavaScript
- 《JavaScript 闖關記》之表示式和運算子JavaScript