第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助 支持 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;
    }