Lua-执行return和or时出错

时间:2018-11-09 21:30:59

标签: debugging error-handling lua

我基本上是在做一些测试以更好地了解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

如果有人能启发我,为什么从技术上讲不可能返回两个值?

1 个答案:

答案 0 :(得分:2)

也许您已经了解发生了什么,但是我已经写了这篇文章。 Lua没有!运算符;我猜你是说not。 (如果有人用!代替not制作了补丁版的Lua,我不会感到惊讶。)

a(nil, 1)返回not nil and d(1) or print("b", true)。现在,not nil的计算结果为true,而d(1)的计算结果为nil,因此我们有true and nil or print("b", true),其计算结果为nil or print("b", true),因此print("b", true)被评估。

关于d(1)为何为nil的原因:它返回not 1 and print("c", false) or print("c", true)。这等效于not 1 and nil or nil,因为print在被调用时始终不返回任何内容,并且运算符niland都不会将其视为ornot x and nil or nil始终求值为nilx是真实的还是虚假的,因此d总是返回nil。 (唯一的区别是,如果d收到一个伪造的值,则会同时评估两个print调用。)

您可以通过调用print来验证type(print('a'))不返回任何内容:它引发错误“错误的参数#1到'type'(期望值)“,而type(nil)返回{{ 1}}。