lua中的local name = value或者0是什么意思?

请问下面这段代码是做什么的?

local name = value or 0

请告诉我它的作用是,如果为nil则使其为0,如果不为nil则使其为value。

点赞
用户4984564
用户4984564

简短回答

是的

长答案

你是正确的。当其他语言逻辑运算符返回 truefalse 时,Lua 和其他一些语言会做一些更聪明的事情:

or 的第一个参数为 truthy 时,它会计算为该值,否则它将计算为第二个参数。并且同样适用于另一种情况:如果它的左边为 falsey,则它计算为左边的值,否则它计算为 RHS。

从逻辑上讲,这意味着,如果任一操作数为真值,则 or 计算为 truthy,如果任一操作数是 falsey,则 and 计算为 falsey。

这经常被用作以下代码的等效代码:

if value then
  name = value
else
  name = 0
end

这实际上是相同的。还经常使用这种方式为变量分配默认值,如下所示:

function call(name)
  name = name or "you"
  print("嘿 "..name.."! 过来一下!")
end

请注意,这不起作用:

function alarm(real)
  real = real or true
  print "ALAAARM!"
  if real then print "This is NOT a drill!" end
end
alarm(false)

这将始终打印“ALAAARM!”“This is NOT a drill!”,因为 false 被评估为 falsey,所以 or 语句评估为其 RHS,即 true。在这个特定的例子中,你必须明确检查参数是否为 nil。

-- ...
  real = (real == nil) and true or real
-- ...

这将按预期工作,因为只有在 real == nil 时,and 语句才会计算为 true,因此 or 语句计算为其 LHS。如果 real == nilfalse,则 and 计算为该值,因此 or 语句计算为其 RHS(因为其 LHS 为 false)。

值得一提的是,andor 都是短路的。这意味着:

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 语句已经知道要返回其左操作数。

2019-01-29 08:00:59