Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua表示例对我不起作用_Lua_Lua Table_Lua 5.3 - Fatal编程技术网

Lua表示例对我不起作用

Lua表示例对我不起作用,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

我正在尝试lua.org和lua硬拷贝的第四版编程中的代码,就我所阅读的所有表格示例都应该有效,但四分之三无效,我在文档中找不到任何说明原因的内容。谢谢你对我所缺少的东西的帮助。我假设一些规范已经改变,因为我已经发现table.getn不再可用。我的linux机器有Lua5.3.5

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