我基本上做了一些测试,以便更好地了解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
如果技术上不可能的话,任何人都可以告诉我为什么它会返回两个值?
也许你已经明白发生了什么,但我已经写过这篇文章了。 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)
评估为零:它返回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
总是返回零。 (唯一的区别是,如果d
收到假值,则会评估两个print
调用。)
你可以通过调用print
验证type(print('a'))
没有返回任何内容:它会将错误“bad argument#1 to'type'(value expected)”,而type(nil)
返回"nil"
。