【问题标题】:Why do some tables in Lua display differently when print(sometable) is called on them?为什么 Lua 中的某些表在调用 print(sometable) 时显示不同?
【发布时间】:2016-10-16 06:30:02
【问题描述】:

我对使用 luaxml 解析 XML 字符串时看到的行为感到困惑。 Lua 文档声明在表变量上调用 print() 如下:

print(type(t))  
print(t)

会产生如下输出:

t2:        table  
t2:        table: 0095CB98

但是,当我这样使用 luaxml 时:

require "luaxml"

s = "<a> <first> 1st </first> <second> 2nd </second> </a>"  
t = xml.eval(s)

print("t:       ", type(t))  
print("t:       ", t)  

我得到以下输出:

t:        table  
t:        <a>  
  <first>1st</first>    
  <second>2nd</second>  
</a>  

为什么print(t) 没有返回类似于第一个示例的结果?

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    print 函数使用tostring 将其参数转换为字符串。

    tostring 被一个表调用,并且该表的元表有一个__tostring 字段,那么tostring 以该表作为参数调用对应的值,并使用调用的结果作为其结果。

    我怀疑luaxml在xml.eval(s)返回的表上有这样一个__tostring元方法。

    【讨论】:

    • 我怀疑是这种性质的事情,但不知道 print() 以这种方式表现。有没有办法在有问题的表对象上“反映”(不确定该术语是否在这里有意义)以查看其元方法?
    • 我会回答我自己的问题,因为你上面的回答引导我找到一个解决方案: mt = getmetatable(t) for key, value in pairs(mt) do print(key, value) end will print元方法....如果需要,setmetatable(t, nil) 也将其删除,谢谢! -杰拉德
    • 顺便说一句,如果有人阅读这篇文章正在使用 luaxml,请注意 xml.eval() 返回的表的索引从 0 开始,而不是 1。
    【解决方案2】:

    您可以在表的元表上定义函数__tostring 以获得此结果。当您将该表传递给 print() 时,如果您的元表上有 __tostring 函数,print() 将输出评估该函数的结果,而不是使用默认方法(仅打印表的内存地址) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多