此第一版是為 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也可以協助 支援 Lua 專案


28.4 – 陣列存取

物件導向表示法的替代方案是使用常規陣列表示法來存取我們的陣列。我們可以簡單地寫入 a[i],而不是寫入 a:get(i)。對於我們的範例,這很容易做到,因為我們的函式 setarraygetarray 已經按照傳遞給各個元方法的順序接收其引數。一個快速解決方案是將這些元方法直接定義到我們的 Lua 程式碼中

    local metaarray = getmetatable(newarray(1))
    metaarray.__index = array.get
    metaarray.__newindex = array.set
(我們必須在陣列的原始實作上執行該程式碼,而沒有物件導向存取的修改。)這就是我們需要使用一般語法的所有內容
    a = array.new(1000)
    a[10] = 3.4         -- setarray
    print(a[10])        -- getarray   --> 3.4

如果我們願意,我們可以在 C 程式碼中註冊這些元方法。為此,我們再次變更我們的初始化函式

    int luaopen_array (lua_State *L) {
      luaL_newmetatable(L, "LuaBook.array");
      luaL_openlib(L, "array", arraylib, 0);
    
      /* now the stack has the metatable at index 1 and
         `array' at index 2 */
      lua_pushstring(L, "__index");
      lua_pushstring(L, "get");
      lua_gettable(L, 2);  /* get array.get */
      lua_settable(L, 1);  /* metatable.__index = array.get */
    
      lua_pushstring(L, "__newindex");
      lua_pushstring(L, "set");
      lua_gettable(L, 2); /* get array.set */
      lua_settable(L, 1); /* metatable.__newindex = array.set */
    
      return 0;
    }