如何用lua api阅读表格中的所有项目?

时间:2015-07-06 06:18:21

标签: api delphi lua

我在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;

此代码在主表中打印键和值类型。但是,如果我将lua_typename(L, lua_type(L, -1))更改为lual_checkstring(L, -1),则它不起作用。我想打印关键和值。

如何打印值?

1 个答案:

答案 0 :(得分:1)

使用lua_next时必须小心,因为多个字符串API函数会改变堆栈上混淆lua_next的值。来自manual

  

在遍历表时,不要直接在键上调用lua_tolstring,除非您知道该键实际上是一个字符串。回想一下lua_tolstring可能会改变给定索引处的值;这会混淆下一次对lua_next的调用。

因此,在lua_next推送的密钥上调用lua_tostringlua_tolstringluaL_checklstring会将密钥更改为字符串。

正如您所发现的,最好在调用lua_type(或调用它的任何API函数)之前使用lua_tolstring来确保该值确实是一个字符串,或者推送密钥的副本可以弹出,保留lua_next未修改的原始密钥。