什么是本地名称=值或lua中的0?

时间:2019-01-29 03:52:45

标签: lua

这段代码是做什么的?

local name = value or 0

请告诉我,如果为零,则将其设置为零;如果不为零,则将其设置为值。

1 个答案:

答案 0 :(得分:2)

简短回答

Looooong答案

您是对的。在其他语言中,逻辑运算符返回truefalse,而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 == 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语句已经知道它将返回其左操作数。