Lua - 执行return和or时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua - 执行return和or时出错相关的知识,希望对你有一定的参考价值。

我基本上做了一些测试,以便更好地了解Lua语言。我发现了一个对我毫无意义的错误。

功能:

local function d(c)
    return (!c and print("c", false) or print("c", true))
end

local function a(b, c)
    return (!b and d(c) or print("b", true))
end

当我运行a(1, nil)a(1, 1)它输出b true,但如果我运行a(nil, 1)然后它输出c trueb true

如果技术上不可能的话,任何人都可以告诉我为什么它会返回两个值?

答案

也许你已经明白发生了什么,但我已经写过这篇文章了。 Lua没有!运营商;我想你的意思是not。 (如果有人用!代替not修改了Lua版本,我不会感到惊讶。)

a(nil, 1)返回not nil and d(1) or print("b", true)。现在,not nil评估trued(1)评估nil,所以我们有true and nil or print("b", true),反过来评估nil or print("b", true),因此评估print("b", true)

至于为什么d(1)评估为零:它返回not 1 and print("c", false) or print("c", true)。这相当于not 1 and nil or nil,因为print在被调用时总是不返回任何内容,并且运算符niland都没有将任何内容视为ornot x and nil or nil总是评估nil是否x是真或假,所以d总是返回零。 (唯一的区别是,如果d收到假值,则会评估两个print调用。)

你可以通过调用print验证type(print('a'))没有返回任何内容:它会将错误“bad argument#1 to'type'(value expected)”,而type(nil)返回"nil"

以上是关于Lua - 执行return和or时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用片段从数据库 SQLite 获取数据时出错

在我的“设置”片段中膨胀类 PreferenceScreen 时出错

第二次在对话框中膨胀片段时出错

Android:在drawerlayout中使用地图膨胀片段时出错

lua 读取lua文件

在片段中创建自定义列表视图时出错所需活动,找到片段