尝试比较 nil 和数字导致堆栈回溯?
2019-11-6 8:41:28
收藏:0
阅读:139
评论:3
我正在按照此链接操作 Lua: https://www.lua.org/pil/4.2.html,并且对某个点感到困惑。
Lua 5.2.4 版权所有 (C) 1994-2015 Lua.org,PUC-Rio
> x=10
> local i=1
> while i<=x do
>> local x = i*2
>> print(x)
>> i=i+1
>> end
stdin:1: 尝试比较 nil 和数字
堆栈追踪:
stdin:1: 在主块中
[C]: 在 ?
我猜想这个错误信息表明 while i<=x 表达式有问题。非常感谢您提供任何意见。
编辑: 我刚刚意识到可能是因为它在终端中无法工作。
点赞
用户3371355
实际上问题出在 local i=1 上
> local i = 1
> print(i)
问题在于当运行控制台时,该行似乎是一个块,变量是该块内部的局部变量。 您可以通过使用全局变量来修复它,或者您可以这样做
> local i = 1 do
>> print(i)
>> end
这将导致块结构如下[local i [print(i)]],因此可以访问 i。 还要注意,local x = i*2 是有效的,因为它在 while - do 块内。
如果您的代码在 Lua 文件内,则还可以正确工作。
2019-11-06 08:51:23
用户2932052
我在Lua 5.3.4中也能重现这个问题。
如果你继续阅读Lua文档,4.2章——局部变量和块,你会看到这句话:
注意,在交互模式下输入这个例子时,它将不能按预期工作。第二行,
local i = 1,本身就是一个完整的代码块。
这正是问题的关键。因此,Lua解释器似乎对最外层块的支持有限(它在Lua文件中明确存在)。但考虑到语言和解释器的紧凑性,这种行为对我来说是可以接受和理解的。
因此,在交互模式下,
要么省略变量i之前的local以使它正常工作:
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
Lua>x=10
Lua>i=1
Lua>while i<=x do
...>local x=i*2
...>print(x)
...>i=i+1
...>end
要么将整个代码块用一个块括起来:
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
Lua>do
...>local x=10
...>local i=1
...>while i<=x do
...>local x=i*2
...>print(x)
...>i=i+1
...>end
...>end
这两种选择都会产生正常(和预期)的输出:
2
4
6
8
10
12
14
16
18
20
2019-11-06 08:59:46
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

在交互终端中它并没有起作用。因为一旦你按回车键,“local i=1”被终端理解为一个单独的代码块。这就是为什么会出现“尝试将nil与数字进行比较”的错误,因为在这种情况下i没有被定义,即为nil。为了修正这个错误,把前两行和while循环放在do代码块里,如下所示。
> do >> x=10 >> local i=1 >> while i<=x do >> local x=i*2 >> print(x) >> i=i+1 >> end >> end 2 4 6 8 10 12 14 16 18 20 >