【Programming in Lua1-7章】讀書筆記

程式設計師菜鳥發表於2020-10-10

很多細節的小點為了防止自己遺忘,也方便以後查詢,順帶回顧一下,分tips記錄在這裡。較為常識的Lua語法在這裡就不在贅述了。

  • Lua返回值可以是多個,但是在一些特定情況下只有一個。如用小括號強制返回一個,函式返回值在賦值語句中不是最後一個:

     

    x,y = foo2(), 20  

    -- x='a', y=20  foo2返回兩個值,但是此時只能返回一個

  • Lua 中類似 return g(...)這種格式的呼叫是尾呼叫。但是 g 和 g 的引數都可以是複雜表示式,因為 Lua 會在呼叫之前計算表示式的值。例如下面的呼叫是尾呼叫: return x[i].foo(x[j] + a*b, i + j)
  • 迭代器是一種支援指標型別的結構,它可以遍歷集合的每一個元素。說白了目前的迭代器就是利用閉包的upvalue來儲存值,實現迴圈呼叫。
  • for <var-list> in <exp-list> do
    
     <body>
    
    end

    <var-list>是一個或多個以逗號分割的變數名列表,<exp-list>是一個或多個以逗號分割的表示式列表,通常情況下 exp-list 只有一個值:迭代工廠的呼叫。

    首先,初始化,計算 in 後面表示式的值,表示式應該返回範性 for 需要的三個值:迭代函式,狀態常量和控制變數;與多值賦值一樣,如果表示式返回的結果個數不足三個會自動用 nil 補足,多出部分會被忽略。

    第二,將狀態常量和控制變數作為引數呼叫迭代函式(注意:對於 for 結構來說,

    狀態常量沒有用處,僅僅在初始化時獲取他的值並傳遞給迭代函式)。

    第三,將迭代函式返回的值賦給變數列表。

    第四,如果返回的第一個值為 nil 迴圈結束,否則執行迴圈體。 第五,回到第二步再次呼叫迭代函式。 更精確的來說:

    for var_1, ..., var_n in explist do block end

    等價於

    do  local _f, _s, _var = explist  while true do   local var_1, ... , var_n = _f(_s, _var)

      _var = var_1   if _var == nil then break end

      block  end

    end

 

 

 

相關文章