第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目。
![]() |
用 Lua 编程 | ![]() |
| 第 IV 部分。C API 第 28 章。C 中的用户定义类型 |
面向对象符号的替代方法是使用常规数组符号来访问我们的数组。我们可以直接写 a[i],而不是写 a:get(i)。对于我们的示例,这很容易做到,因为我们的函数 setarray 和 getarray 已经按照传递给各个元方法的顺序接收其参数。一个快速解决方案是将这些元方法直接定义到我们的 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;
}
| 版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 | ![]() |