这段代码是做什么的?
local name = value or 0
请告诉我,如果为零,则将其设置为零;如果不为零,则将其设置为值。
答案 0 :(得分:2)
是
您是对的。在其他语言中,逻辑运算符返回true
或false
,而Lua(和某些其他语言)则更聪明:
当or
的第一个参数为true时,它将求值为该值,否则,它将求值为第二个。并采取另一种方法:如果左侧为假,则评估为假,否则评估为RHS。
从逻辑上讲,这意味着or
的任何一个操作数为真时都为真,and
的两个操作数都为假时时。
这通常等同于
if value then
name = value
else
name = 0
end
它有效地执行了相同的操作。它还经常用于为变量分配默认值,如下所示:
function call(name)
name = name or "you"
print("Hey "..name.."! Come here for a moment!")
end
但是请注意,这不起作用
function alarm(real)
real = real or true
print "ALAAARM!"
if real then print "This is NOT a drill!" end
end
alarm(false)
这将始终打印“ ALAAARM!” “这不是操练!”,因为false
被评估为错误,因此or
语句的评估结果为其RHS,即true
。在此特定示例中,您将必须显式检查参数是否为nil。
-- ...
real = (real == nil) and true or real
-- ...
这将按预期工作,因为只有在real == nil
的情况下,and
语句的值为true
,而or
的值为LHS。如果real == nil
为false
,则and
对此求值,因此or语句对其RHS求值(因为其LHS为false
)。
值得一提的是and
和or
都短路了。这意味着什么:
function foo(bar)
print(bar)
return bar
end
io.write "First: "
local A = foo(nil) or foo(false)
io.write "Second: "
local B = foo(true) or foo(true)
这将在前两行打印“ First:nil false”,然后在第三行打印“ Second:true”。甚至没有执行对foo
的最后一次调用,因为此时or
语句已经知道它将返回其左操作数。