Lua表中不返回'nil'
2016-2-19 22:7:39
收藏:0
阅读:97
评论:4
我有这样一个匿名的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的新手。
点赞
用户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
你需要遍历所有想要打印值的键。
可能的方式:
- 预先知道长度。(warspyking提及过这一点)
- 使用一个结束标记。
- 通过某种方式计算长度(例如使用maxn)。
- 使用某物来代表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
其他答案很好地回答了你的第二个问题,但简单的解释事实是 任何键的值为 nil 的键都不被视为表的一部分。相反,任何不是表的一部分的键都有一个关联值 nil。 给一个值 nil 可以删除具有相同键的任何现有键值对。
2016-02-20 16:55:39
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
当使用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