运算符#nil值在数组末尾

时间:2014-09-18 02:18:46

标签: arrays lua

我用:

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,最后两个为零?非常感谢

3 个答案:

答案 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。