Lua表中不返回'nil'

我有这样一个匿名的Lua函数:

an_func = function(x) return x == nil end

我需要测试一个包含4个值的表格:{'None', nil, 1, '1'}。 因此,我写了下面的代码:

for num, element in pairs({'None', nil, 1, '1'}) do
    print(num .. ': ' .. tostring(an_func(element)))
end

当我运行它时,只打印了三行:

1: false
3: false
4: false

对应于表元素 nil 的那一行没有打印出来。

你能解释一下,为什么Lua打印了所有结果,但没有打印true的值吗?我该如何修复它以输出所有4行?

P.S. 我是Lua的新手。

点赞
用户5352026
用户5352026

当使用pairs()时,它会遍历表中的所有元素。nil_表示_空_,所以它不会遍历它。为什么它要告诉你表中没有内容呢?如果你有一个全新的表,如果你使用任何索引,它将返回_nil_。print(({}).test)-->nil 如果你真的想要得到_nil,你可以使用一个虚拟值:

local NIL = setmetatable({},{__tostring=function() return "nil" end})

an_func = function(x) return x == NIL end

for num, element in pairs({'None', NIL, 1, '1'}) do
    print(num .. ': ' .. tostring(an_func(element)))
end

输出:

1: false
2: true
3: false
4: false
2016-02-19 21:59:30
用户3979429
用户3979429

在 Lua 中,所有东西 _(函数、字符串、线程...) 都是一个值,只有 nil (以及技术上的 none/void) 是唯一的例外。简单来说,nil _代表了没有值的存在_。因此,在遍历表时,为什么 Lua 会说没有东西。如果它这样做,它就必须遍历您可以创建的每个虚拟可能的索引。

但是,这似乎是在使用数组。您_技术上_可以遍历它,假设您_know长度_. 我会假设表中的最后一个项目不是 nil,并且没有在分配初始长度后分配任何空洞,但是在您的情况下可能并非如此,如果不是,则必须自己跟踪长度并使用它而不是 # 运算符:

for i = 1,#t do
    local v = t[i]
    print (v == nil)
end
2016-02-20 00:59:24
用户3586583
用户3586583

你需要遍历所有想要打印值的键。

可能的方式:

  1. 预先知道长度。(warspyking提及过这一点)
  2. 使用一个结束标记。
  3. 通过某种方式计算长度(例如使用maxn)。
  4. 使用某物来代表nil值。(EinsteinK给出了一个例子)

每种方式都有利弊,这里列出一些:

第一种方式需要在所有情况下预先知道长度,可能很困难。 结束标记很方便,但需要在标记周围进行移动。 计算长度如果最后一个元素是nil则不起作用。

计算长度的示例-假设最后一个元素不是nil。 注意:lua 5.1有一个可以使用而不是自定义maxn实现的table.maxn。

an_func = function(x) return x == nil end

function maxn(t)
    local n = 0
    for k,v in pairs(t) do
        if k%1 == 0 then
            n = k
        end
    end
    return n
end

local t = {'None', nil, 1, '1'}
for num = 1, maxn(t) do
    print(num .. ': ' .. tostring(an_func(t[num])))
end

使用结束标记的示例:

an_func = function(x) return x == nil end

local END = {}
local t = {'None', nil, 1, '1', END}

local num = 1
while t[num] ~= END do
    print(num .. ': ' .. tostring(an_func(t[num])))
    num = num+1
end
2016-02-20 13:01:18
用户2226988
用户2226988

其他答案很好地回答了你的第二个问题,但简单的解释事实是 任何键的值为 nil 的键都不被视为表的一部分。相反,任何不是表的一部分的键都有一个关联值 nil 给一个值 nil 可以删除具有相同键的任何现有键值对。

2016-02-20 16:55:39