第一版是為 Lua 5.0 所寫。雖然對於後續版本來說仍然有很大的相關性,但有些地方有所不同。
第四版針對 Lua 5.3,可以在 Amazon 和其他書店買到。
購買這本書,您同時也 支持 Lua 專案


13.4.3 – 有預設值的表格

一般表格中任何欄位的預設值都是 nil。使用元表格可以輕鬆變更這個預設值

    function setDefault (t, d)
      local mt = {__index = function () return d end}
      setmetatable(t, mt)
    end
    
    tab = {x=10, y=20}
    print(tab.x, tab.z)     --> 10   nil
    setDefault(tab, 0)
    print(tab.x, tab.z)     --> 10   0
現在,每當我們存取 tab 中不存在的欄位時,就會呼叫其 __index 元方法,並傳回零,這是該元方法中 d 的值。

setDefault 函式會為每個需要預設值的表格建立一個新的元表格。如果有很多表格需要預設值,這樣做可能會很花時間。不過,元表格會將預設值 d 內建其中,所以函式無法為所有表格使用單一元表格。若要讓有不同預設值的表格可以使用單一元表格,我們可以使用一個獨佔欄位,將每個表格的預設值儲存在表格本身。如果我們不擔心名稱衝突,可以使用像 "___" 這樣的金鑰作為我們的獨佔欄位

    local mt = {__index = function (t) return t.___ end}
    function setDefault (t, d)
      t.___ = d
      setmetatable(t, mt)
    end
如果我們擔心名稱衝突,可以很容易地確保這個特殊金鑰的獨特性。我們只需要建立一個新表格,並將其用作金鑰
    local key = {}    -- unique key
    local mt = {__index = function (t) return t[key] end}
    function setDefault (t, d)
      t[key] = d
      setmetatable(t, mt)
    end

將每個表格與其預設值關聯起來的另一種方法是使用一個獨立的表格,其中索引是表格,而值是其預設值。不過,若要正確實作這種方法,我們需要一種稱為弱表格的特殊表格,所以我們不會在這裡使用它;我們會在 第 17 章 回到這個主題。

另一種方法是記憶元表格,以便為有相同預設值的表格重複使用相同的元表格。不過,這也需要弱表格,所以我們必須等到 第 17 章