2015-08-24 67 views
-3
... 
print(a.b():c():d()) 
... 

何時以及如何評估調用鏈?我看到兩種選擇:如何評估一系列函數調用

  • 當解釋器到達線路時,所以以後任何print()函數都只能和最後一個d()一起工作。
  • 當print()實際訪問參數時,每次執行該行時都會評估整個鏈(期望的行爲,順便說一句)。
+0

不,我真的想要鏈條就像我寫的那樣。 – ZzZombo

+0

1.「調用鏈」('a.b():c():d()')是一個不相干的分心:問題是'print'參數是否被多次評估。 2.你可以比你發佈問題的速度更快地進行測試。這是它在每種編程語言中的工作方式。 4.「口譯員」沒有「達到這條線」;詞法分析器到達該行,標記它,將標記提供給解析器,解析器然後發出字節碼。這是解釋的字節碼(請參閱:lhf的答案)。 – Mud

回答

3

每次執行該行時都會評估整個鏈。

精確的指令集,是通過給予所討論的行luac -l所示:

1 [1] GETTABUP 0 0 -1 ; _ENV "print" 
2 [1] GETTABUP 1 0 -2 ; _ENV "a" 
3 [1] GETTABLE 1 1 -3 ; "b" 
4 [1] CALL  1 1 2 
5 [1] SELF  1 1 -4 ; "c" 
6 [1] CALL  1 2 2 
7 [1] SELF  1 1 -5 ; "d" 
8 [1] CALL  1 2 0 
9 [1] CALL  0 0 1 
10 [1] RETURN  0 1 

上述代碼假定a是一個全局變量。如果a是一個局部變量,則會略有不同。