我在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)
,则它不起作用。我想打印关键和值。
如何打印值?
答案 0 :(得分:1)
使用lua_next
时必须小心,因为多个字符串API函数会改变堆栈上混淆lua_next
的值。来自manual:
在遍历表时,不要直接在键上调用lua_tolstring,除非您知道该键实际上是一个字符串。回想一下lua_tolstring可能会改变给定索引处的值;这会混淆下一次对lua_next的调用。
因此,在lua_next
推送的密钥上调用lua_tostring,lua_tolstring或luaL_checklstring会将密钥更改为字符串。
正如您所发现的,最好在调用lua_type
(或调用它的任何API函数)之前使用lua_tolstring
来确保该值确实是一个字符串,或者推送密钥的副本可以弹出,保留lua_next
未修改的原始密钥。