你为什么要在布尔表达式的末尾添加“或 false”?

我看过类似于lua中的这样的代码:

if (a==b or false) then

"or false"的目的是什么?

这是原始代码:

  Function = function(self, aura, auraID)
  -- 存储版本号。
  -- aura.Version = 50000;
  -- 修复texmode/glow。
  aura.texmode = (aura.texmode == 1 or aura.texmode == true or false);
  -- 纹理源。
  if(aura.owntex or aura.SourceType == PowaAuras.SourceTypes.Icon) then
      aura.SourceType = PowaAuras.SourceTypes.Icon;
  elseif(aura.wowtex or aura.SourceType == PowaAuras.SourceTypes.WoW) then
      aura.SourceType = PowaAuras.SourceTypes.WoW;
  elseif(aura.customtex or aura.SourceType == PowaAuras.SourceTypes.Custom) then
      aura.SourceType = PowaAuras.SourceTypes.Custom;
  elseif(aura.textaura or aura.SourceType == PowaAuras.SourceTypes.Text) then
      aura.SourceType = PowaAuras.SourceTypes.Text;
  else
      aura.SourceType = PowaAuras.SourceTypes.Default;
  end

end

这是另一个例子:

  -- 遍历元素子项。
visible, hidden = self:UpdateScrollList(key, level+1, visible, hidden,
  (parentShowing == true and item:GetExpanded() or false));

原文链接 https://stackoverflow.com/questions/6705576

点赞
stackoverflow用户513763
stackoverflow用户513763
没有用处,因为如果 `a~=b` 那么它会尝试 false,但 false 实际上也是 false,并且无论如何都会返回 false ...
2011-07-15 10:26:13
stackoverflow用户689543
stackoverflow用户689543

它被用于临时禁用一块代码。

它的语义技术上与以下代码相同:

#if 0
    此处放置死代码...
#endif
2011-07-15 10:51:29
stackoverflow用户596285
stackoverflow用户596285

这似乎是一种语法行为:

a=b or false

它会将 a 初始化为 b 的值,如果 b 未定义,则为 false

就你写的 if 语句而言,我看不到任何目的, 因为 ==or 之前执行。如果他们使用括号更改运算符的顺序,那么它可以用来验证 b 是否已定义,例如:

> a=nil
> b=nil
> if (a == (b or false)) then print("yikes") else print("aok") end
aok
> if (a == b or false) then print("yikes") else print("aok") end
yikes
2011-07-15 12:26:19
stackoverflow用户34799
stackoverflow用户34799

在没有前置条件成立时,明确声明赋给表达式的值。

在 Lua 中,andor 表达式返回确定其真值的值,而不是简单的真值本身,如下所示:

function And(A,B)
  if A then return B --如果 A 是真的,则两者的一致性取决于 B
  else return A end  --否则,它们不是,因为 A 不是真的
end

function Or(a,b)
  if A then return A --如果 A 是真的,则无论 B 是否为真都无所谓
  else return B end  --否则,真相取决于 B 的值
end

在 Lua 中,除了 falsenil 之外的所有值在条件结构中都会被评估为 true,因此这种行为通常被用作默认值的习语:

local color = color or 'blue' --如果 `color` 被定义为任何值,而不是
                              --`false`(如任何字符串),它将被评估为 true,
                              --并且该值将从 `or` 语句中返回(因此 `color` 将被赋
                              --值为其自身的值,不会产生任何变化)-
                              --如果 `color` 未定义,`or` 语句
                              --将评估其 `nil` 值为 false 并
                              --返回第二个值 'blue'

这种习语可以通过各种方式组合和扩展:

local color = color or self.color
  or (favorites and favorites.color)
  or (type(favourites)=='table' and favourites.colour)
  or get_defaults('color')
  or {'red','blue','green','yellow'}[math.random(1,4)]

然而,传统上它们保持相当简单,可能会有一些链式的 or 情况,然后才是默认值。

这就是我们在这里看到的:or false 被用于表达式的最后一个值。

因此,虽然这个:

aura.texmode = (aura.texmode == 1 or aura.texmode == true or false);

可以写成这样,效果完全相同(因为 == 比较将返回 truefalse):

aura.texmode = (aura.texmode == 1 or aura.texmode == true);

添加最后一个 or false 使得在查看该行时更容易看出该值可以是 false。

对于第二个例子,分配给一个参数的值也是如此。

2011-07-15 14:27:04