此第一版是為 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也可以協助 支援 Lua 專案。
![]() |
用 Lua 程式設計 | ![]() |
第四部分。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。保留所有權利。 | ![]() |