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;

}


相关链接:
lua程序设计目录 - 中国lua开发者 - lua论坛