表操作
為了訪問或更改表的索引,你需要以某種方式將表放入堆疊。
讓我們假設,對於這個例子,你的表是一個名為 tbl 的全域性變數。
獲取特定索引的內容:
int getkey_index(lua_State *L)
{
lua_getglobal(L, "tbl"); // this put the table in the stack
lua_pushstring(L, "index"); // push the key to access
lua_gettable(L, -2); // retrieve the corresponding value; eg. tbl["index"]
return 1; // return value to caller
}
正如我們所看到的,你所要做的就是將表推入堆疊,推送索引並呼叫 lua_gettable。 -2 參數列示該表是堆疊頂部的第二個元素。
lua_gettable 觸發元方法。如果你不想觸發元方法,請改用 lua_rawget。它使用相同的引數。
在特定索引處設定內容:
int setkey_index(lua_State *L)
{
// setup the stack
lua_getglobal(L, "tbl");
lua_pushstring(L, "index");
lua_pushstring(L, "value");
// finally assign the value to table; eg. tbl.index = "value"
lua_settable(L, -3);
return 0;
}
獲取內容的練習相同。你必須推送堆疊,推送索引,然後將值推入堆疊。之後,你呼叫 lua_settable。 -3 引數是表中堆疊的位置。要避免觸發元方法,請使用 lua_rawset 而不是 lua_settable。它使用相同的引數。
將內容從錶轉移到另一個表:
int copy_tableindex(lua_State *L)
{
lua_getglobal(L, "tbl1"); // (tbl1)
lua_getglobal(L, "tbl2");// (tbl1)(tbl2)
lua_pushstring(L, "index1");// (tbl1)(tbl2)("index1")
lua_gettable(L, -3);// (tbl1)(tbl2)(tbl1.index1)
lua_pushstring(L, "index2");// (tbl1)(tbl2)(tbl1.index1)("index2")
lua_pushvalue(L, -2); // (tbl1)(tbl2)(tbl1.index1)("index2")(tbl1.index1)
lua_settable(L, -4);// (tbl1)(tbl2)(tbl1.index1)
lua_pop(L, 1);
return 0;
}
現在我們正在把我們在這裡學到的所有知我把堆疊內容放在評論上,這樣你就不會迷路。
我們將兩個表放入堆疊,將表 1 的索引推入堆疊,並獲取 tbl1.index1
的值。注意關於 gettable 的 -3
引數。我正在檢視第一個表(從頂部開始的第三個)而不是第二個表。然後我們推送第二個表的索引,將 tbl1.index1
複製到堆疊的頂部,然後在頂部的第 4 個專案上呼叫 lua_settable
。
為了清理房間,我已經清除了頂部元素,因此只有兩個表格保留在堆疊中。