我用:
b.x = {}
a = Obj()
a:AddParams("a", "b", "c")
...
...
function Obj:AddParams(a, b, c, d, e)
table.insert(b.x, {["one"] = a, ["two"] = b, ["three"] = c, ["four"] = d, ["five"] = e})
end
然后我打印#b.x并打印1.不应该打印2,因为#manrator计算nil值而我只给出前3个参数:a AddParams,最后两个为零?非常感谢
答案 0 :(得分:1)
b.x
的方式, table.insert
实际上是一个元素表,其中单个元素是另一个表:
b.x = {
[1] = { <======= this single element in the top-level
["one"] = "a", b.x table is what the # operator counts
["two"] = "b", when you apply it as #b.x
["three"] = "c"
}
}
因此,无论您传递给函数的是什么,调用#b.x
都将始终返回1,因为您始终将表添加为原始空表中的单个元素您将b.x
初始化为。
但请注意,即使您没有创建此嵌套表格,从#
返回的值仍然不会是您所期望的。 #
运算符不计算nil值。 #
运算符计数的是从1 (和is not defined for tables with non-sequential numerical indices)开始的表的连续数字索引的长度。因此,
#{ [1]="a", [2]="a" }
评估为2
#{ [1]="a", [3]="a" }
未由Lua标准定义,因为非顺序索引#{ [1]="a", ["two"]="b" }
评估为1
(因为"two"
不是数字,而是字符串)。不知道你从哪里获得1:
> a = {}
> a[1] = "a"
> a[2] = "b"
> a[3] = "c"
> a[4] = nil
> a[5] = nil
> print(#a)
3
(请注意,将nil
指定为表格末尾的值不会产生任何效果 - 您会得到相同的结果,省略a[4]
和a[5]
行。)< / p>
您是否真的跳过了a[2]
?这将导致#a
为1,因为它只计算从索引1
开始的连续项。
答案 1 :(得分:1)
不应该打印2,因为#manrator计算nil值
不,恰恰相反!
首先,向表中添加nil
的整个概念无效。您可以将任何内容存储在表中,但 nil
除外。这样做很简单,删除该键中已存在的值(索引),但不会在其中插入nil
。它就像数学空集∅,用于表示空虚作为一个实体,但不是一个有形的价值/对象。访问表中没有的任何索引会给你nil
,你不必插入一个看到它们在那里;任何不存在的键都具有值nil
,表示该值不存在。
> a = { }
> print(a[1])
nil
> a = { "abc" }
> print(a[1])
abc
> a[1] = nil -- this is just erasing 'abc' from the table; not add/insert nil
> print(a[1])
> nil
因此,它们永远不会构成桌子的大小。
length运算符返回n,序列中元素的计数;序列是一个具有值的表(当然是非零 - 这是暗示的,因为一个人永远不能插入如上所述的nil),由连续的整数索引,从1开始扩展到某个正整数n。如果它们不连续(破洞),则不应使用运算符#
。 Lua manual特别指出,仅当表是序列时才定义使用#
。但请注意,非整数键与表的序列性质无关。
答案 2 :(得分:0)
您正在构建一个表并将其插入带有键1的空表中。如果要插入多个元素,则必须为每个元素调用insert。
并且,您正在构建的表具有字符串键,它们根本不会影响#。
我建议您使用带调试器的IDE。请参阅[lua]代码wiki。