饥荒 lua attempt to call a nil value

Lua5.3更新后的getn替代方案
本文探讨了从Lua5.1升级到Lua5.3.4后,因table.getn()被移除导致的兼容性问题。详细介绍了如何使用新的语法'#mytable'来获取表长度,解决尝试调用nil值的错误。

最近更新了lua版本到最新的版本Lua 5.3.4 Copyright © 1994-2017 Lua.org, PUC-Rio
在运行旧的项目的时候出现了如下错误
xxx: attempt to call a nil value (field ‘getn’)
stack traceback:

网上查了一下,发现也有许多朋友出现了这样的问题,原因是lua在5.1以后的版本去除了table.getn(),这点觉得lua做的不好,兼容性要保证吧。
好吧,这里不吐槽了,既然去除了table.getn(),就应该有新的方式代替,没错新的方式是#mytable

$ lua
Lua 5.3.4 Copyright © 1994-2017 Lua.org, PUC-Rio

mytable = {1,2,3,4}
table.getn(mytable)
stdin:1: attempt to call a nil value (field ‘getn’)
stack traceback:
stdin:1: in main chunk
[C]: in ?
#mytable

`attempt to call a nil value (for iterator)` 错误通常在 Lua 中出现,意味着尝试调用一个 `nil` 值作为迭代器。以下是一些可能的原因及对应的解决方法: ### 迭代器未正确初始化 在 Lua 中,当使用 `for` 循环搭配迭代器时,迭代器函数不能为 `nil`。比如使用 `ipairs` 或 `pairs` 时,传入的表应该是有效的。若迭代器函数本身为 `nil`,就会引发此错误。 ```lua -- 错误示例 local badTable = nil for k, v in badTable do print(k, v) end -- 正确示例 local goodTable = {1, 2, 3} for k, v in ipairs(goodTable) do print(k, v) end ``` ### 自定义迭代器函数未正确返回 若使用自定义迭代器函数,要保证该函数被正确定义且返回有效的值。 ```lua -- 错误示例 local badIterator for k, v in badIterator do print(k, v) end -- 正确示例 local function customIterator(t) local i = 0 return function() i = i + 1 return t[i] end end local myTable = {10, 20, 30} for value in customIterator(myTable) do print(value) end ``` ### 变量作用域问题 确保迭代器函数在使用时处于正确的作用域内。 ```lua -- 错误示例 do local function localIterator() return function() return nil end end end -- 这里 localIterator 超出了作用域,为 nil for k, v in localIterator do print(k, v) end -- 正确示例 local function globalIterator() return function() return nil end end for k, v in globalIterator() do print(k, v) end ``` ### 表元素为 `nil` 导致迭代器提前结束 在使用 `ipairs` 时,遇到第一个 `nil` 元素会停止迭代,但一般不会引发此错误。不过在自定义迭代器时,要确保处理好 `nil` 元素。 ```lua local mixedTable = {1, nil, 3} -- 使用 ipairs 遇到 nil 会停止迭代 for k, v in ipairs(mixedTable) do print(k, v) end -- 自定义迭代器时要正确处理 nil local function customSafeIterator(t) local i = 0 return function() i = i + 1 return t[i] end end for value in customSafeIterator(mixedTable) do if value ~= nil then print(value) end end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值