この第 1 版は Lua 5.0 用に作成されました。これはその後のバージョンでも大部分は関連していますが、若干相違があります。
第 4 版は Lua 5.3 を対象としており、Amazon やその他の書店で購入できます。
この本を購入することによって、Lua プロジェクトを支援することもできます。


28.4 – 配列のアクセス

オブジェクト指向表記に対する代替として、通常の配列表記を使用して配列にアクセスすることもできます。a:get(i) を書く代わりに、a[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;
    }