第一版是为 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。保留所有权利。 |