Lua表示例对我不起作用
我正在尝试lua.org和lua硬拷贝的第四版编程中的代码,就我所阅读的所有表格示例都应该有效,但四分之三无效,我在文档中找不到任何说明原因的内容。谢谢你对我所缺少的东西的帮助。我假设一些规范已经改变,因为我已经发现table.getn不再可用。我的linux机器有Lua5.3.5Lua表示例对我不起作用,lua,lua-table,lua-5.3,Lua,Lua Table,Lua 5.3,我正在尝试lua.org和lua硬拷贝的第四版编程中的代码,就我所阅读的所有表格示例都应该有效,但四分之三无效,我在文档中找不到任何说明原因的内容。谢谢你对我所缺少的东西的帮助。我假设一些规范已经改变,因为我已经发现table.getn不再可用。我的linux机器有Lua5.3.5 local t1={} t1[1]="Foo" t1[2]="Bar" print("Size: "..#t1) print("Works:&qu
local t1={}
t1[1]="Foo"
t1[2]="Bar"
print("Size: "..#t1)
print("Works:"..table.concat(t1,'$$'))
local t2={}
t2[5]="Foo"
t2[40]="Bar"
print("Size: "..#t2)
print("Doesnt Work:"..table.concat(t2,'$$'))
local t3={}
t3["A"]="Foo"
t3["B"]="Bar"
print("Size: "..#t3)
print("Doesnt Work:"..table.concat(t3,'$$'))
local t4={}
t4.A="Foo"
t4.B="Bar"
print("Size: "..#t4)
print("Doesnt Work:"..table.concat(t4,'$$'))
结果
Size: 2
Works:Foo$$Bar
Size: 0
Doesnt Work:
Size: 0
Doesnt Work:
Size: 0
Doesnt Work:
请阅读
应用于表的长度运算符返回该表中的边框。
表t中的边框是满足下列条件的任意自然数:
以下情况:
(border == 0 or t[border] ~= nil) and t[border + 1] == nil
换句话说,边框是表中的任何自然索引,即
当索引1不存在时,后跟不存在的索引或零
只有一个边框的表称为序列。例如,
表{10,20,30,40,50}是一个序列,因为它只有一个
边界5。表{10,20,30,nil,50}有两个边界3和5,
因此它不是一个序列。索引4处的零称为a
洞表{nil,20,30,nil,nil,60,nil}有三个边界
0、3和6以及索引1、4和5处的三个孔,因此它不是
序列也是。表{}是一个边框为0的序列。注意
非自然键不会影响表是否是序列
当t是一个序列时,t返回它的唯一边界,它对应于
序列长度的直观概念。当t不是一个
序列,t可以返回它的任何边界。具体取决于
表的内部表示形式的详细信息,这反过来又可以
取决于表的填充方式及其内存地址
非数字键
适用于您的示例:
local t1={}
t1[1]="Foo"
t1[2]="Bar"
t1只有一个边界2,因为t1[2]~=nil和t1[2+1]==nil
t1只有一个边框->t1是一个边框->t1是t1的长度
t2有3个边界0、5、40,因为边界==0和t[0+1]==nil、t[5]~=nil和t[5+1]==nil、t[40]~=nil和t[40+1]==nil
t2有多个边框->t2是其任意边框,而不是其长度
local t3={}
t3["A"]="Foo"
t3["B"]="Bar"
t3有1个边框0,因为边框==0和t3[0+1]==nil,没有更多的数字键,所以没有更多的边框。t3只有一个边框->t3是长度为0的序列
local t4={}
t4.A="Foo"
t4.B="Bar"
与t4相同,因为t.name是t[name]的语法糖。仅适用于有效的Lua名称
t1是示例中唯一的序列,因此唯一一个序列会产生元素的数量
如果不确定是否有序列,则应按如下方式计算元素:
local n = 0
for _ in pairs(t) do
n = n + 1
end
这是打印表t的边界的方式:
local n = 0
for _ in pairs(t) do
n = n + 1
end
function printBorders(t)
local borders = {}
for k in pairs(t) do
if type(k) == "number" and
t[k] ~= nil and t[k+1] == nil then
table.insert(borders, k)
end
end
if t[1] == nil then table.insert(borders, 0) end
table.sort(borders)
print(table.concat(borders, ", "))
end