如何使用Lua API读取表中所有项目?

我有一个包含表格的Lua文件。

这是表格:

main = {}

main["first"] = {
  {name = "sammy", type = "dog", age = 2, color = "blue"},
  {name = "tom", type = "cat", age = 3, color = "orange"},
.
.
.
.
}

main["second"] = {
  {name = "grim", type = "cow", age = 1, color = "green"},
  {name = "jerry", type = "horse", age = 2, color = "grey"},
.
.
.
.
}

该表格有两个表格。我想要读取main中的所有表格。因此,我编写了以下代码(我使用Delphi。plua_state表示lua_state的指针):

这是我的代码:

procedure TForm1.PrintTable(l: Plua_State);
var
  TempStr : String;
begin
  lua_pushnil(l);

  TempStr := '';
  while lua_next(l,-2) <> 0 do
  begin
    case lua_type(l,-1) of
      LUA_TTABLE :
        PrintTable(l);

    else
      TempStr := TempStr + lual_checkstring(L, -2) + '='
                 + lua_typename(L, lua_type(L, -1)) + ',';
    end;
    lua_pop(l,1);
  end;

  fStringList.Add(TempStr);
end;

该代码打印了main表格中的键和值类型。但是,如果我将lua_typename(L, lua_type(L, -1))更改为lual_checkstring(L, -1),它将不起作用。我想打印键和值。

如何打印值?

点赞
用户415823
用户415823

当使用 lua_next 时,你必须小心,因为几个字符串 API 函数会改变堆栈上的值,从而使 lua_next 混淆。来自于手册

在遍历一个表时,不要直接在一个键上调用 lua_tolstring,除非你确知这个键实际上是一个字符串。记住,lua_tolstring 可能会改变给出索引上的值;这样会混淆下一个对 lua_next 的调用。

因此,对 lua_next 推送的键调用 lua_tostringlua_tolstring 或者 luaL_checklstring 会将键更改为字符串。

正如你所发现的那样,最好使用 lua_type 来确保值确实是一个字符串,然后再调用 lua_tolstring(或调用它的任何 API 函数),或者推送一个键的副本,这样就可以弹出并保留由 lua_next 返回的原始键。

2015-07-06 19:17:34