我基本上是在做一些测试以更好地了解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 true
和b true
>
如果有人能启发我,为什么从技术上讲不可能返回两个值?
答案 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
在被调用时始终不返回任何内容,并且运算符nil
和and
都不会将其视为or
。 not x and nil or nil
始终求值为nil
是x
是真实的还是虚假的,因此d
总是返回nil。 (唯一的区别是,如果d
收到一个伪造的值,则会同时评估两个print
调用。)
您可以通过调用print
来验证type(print('a'))
不返回任何内容:它引发错误“错误的参数#1到'type'(期望值)“,而type(nil)
返回{{ 1}}。