Почему вы добавляете «или ложь» в конец вашего логического выражения? - PullRequest
1 голос
/ 15 июля 2011

Я видел код в lua, как это

if (a==b or false) then

какова цель слова "или ложь"?

Это оригинальный код:

        Function = function(self, aura, auraID)
        -- Store the version.
        -- aura.Version = 50000;
        -- Fix texmode/glow.
        aura.texmode = (aura.texmode == 1 or aura.texmode == true or false);
        -- Texture source.
        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

А вот еще один пример

            -- Iterate over element children.
        visible, hidden = self:UpdateScrollList(key, level+1, visible, hidden, 
            (parentShowing == true and item:GetExpanded() or false));

Ответы [ 4 ]

6 голосов
/ 15 июля 2011

Это похоже на поведение, которое исходит из синтаксиса:

a=b or false

для инициализации a значением b или false, если b не определено.

В выражении 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
2 голосов
/ 15 июля 2011

Это явное указание значения, назначенного выражению, когда ни одно из его предыдущих условий не является истинным.

В Lua выражения and и or возвращают значения, которые определяют их истинные значения, скореечем само плоское значение истинности, например:

function And(A,B)
  if A then return B --if A is true, then the agreement of both depends on B
  else return A end  --otherwise, they're not, because A wasn't
end

function Or(a,b)
  if A then return A --if A is true, then it doesn't matter if B was true
  else return B end  --otherwise, the truth hinges on B's value
end

В Lua все значения, кроме false и nil, оцениваются как true в условных конструкциях, поэтому это поведение обычно используется какидиома для описания значений по умолчанию:

local color = color or 'blue' -- if `color` is defined to any value other than
                              -- `false` (such as any string), it will evaluate
                              -- as true, and the value will be returned from
                              -- the `or` statement (so `color` will be assigned
                              -- its own value and no change will result) -
                              -- if `color` is not defined, the `or` statement
                              -- will evaluate its `nil` value as false and
                              -- return the second value, '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);

можно было бы написать так же с таким же эффектом (поскольку сравнение == вернет либо true, либо false):

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

добавлениеОкончательный or false делает более очевидным, глядя на эту строку, что значение может быть ложным.

То же самое касается второго примера, в котором значение присваивается аргументу.

2 голосов
/ 15 июля 2011

Используется для временного отключения блока кода.

Его семантика технически такая же, как:

#if 0
    dead code goes here ...
#endif
1 голос
/ 15 июля 2011

Бесполезно, потому что если a ~ = b, то он попытается использовать false, что является ... false и в любом случае вернет false ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...