表操作

為了訪問或更改表的索引,你需要以某種方式將表放入堆疊。
讓我們假設,對於這個例子,你的表是一個名為 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

為了清理房間,我已經清除了頂部元素,因此只有兩個表格保留在堆疊中。