2011-07-15 1 views
1

私は「または偽」の目的が何であるか、このなぜあなたはあなたのブール式の末尾に追加「または偽」でしょうか?

if (a==b or false) then 

ようLUAのコードを見たことがありますか?

これは元のコードです:

 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)); 
+0

これはコンテキストで使用される完全なスクリプトをポイントできますか? –

+0

ああ。 BMitchの回答を参照してください。これらのケースでは、 "or"は割り当ての明示的な値を定義しています。提供された例のいずれかでそれをそうするための*本当の*理由は、明快さ以外のものではありません。 –

答えて

6

「Tが定義しました。 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 
+1

私はこれが正しい答えだと思いますが、元のコーダーはそれをしませんでした右: –

+0

私は元のコーダーをconatctすることができたと彼は言った: "私はPHP/C#/ etcの3進演算に慣れています 明示的に真偽の宣言を必要とする....古い習慣はハードに死ぬ" –

1

〜の= bの場合はそれがある、偽しようとしますので、何の使用は、ありません。.. 。一時的にコードのブロックを無効にするために使用される

+0

はい、誰かが使用していると考える必要があります。それは私が紛失しているものか、彼らが理解していないものですか?その場合、 –

2

...偽とにかくfalseを返します。

それは意味が技術的に同じですです:b ISN場合bまたはfalseの値にaを初期化するために

a=b or false 

:これは構文から来ている行動のように見えます

#if 0 
    dead code goes here ... 
#endif 
+0

は「とfalse」である必要がありますか? –

+0

真ですが、前の式がすでに負の値を返しているため、無効になっているとします。 – hiobs

+0

しかし、もしa == bがfalseを返すとすれば、条件はとにかくfalseなので、あなたは 'またはfalse'を必要としません。 – jpjacobs

2

これは、明示的にその前の条件のいずれもありません式に割り当てられた値を述べることです真。 Luaので

andor表現は、このように、かなりフラットな真理値そのものよりも、その真理値を決定する値を返す:すべてのfalse以外の値とnilを評価、Luaので

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 

このイディオムを組み合わせることができる

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' 

:条件付きの構成でtrueするので、この現象は、一般的にデフォルト値を記述するためにイディオムとして使用されますそして、様々な方法で拡張:

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); 

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

がまったく同じ効果(==比較がtrueまたはfalseのいずれかを返しますので)で、このように書かれている可能性がor falseは、その行を見て、値が偽である可能性があることをより明白にします。

値が引数に割り当てられている2番目の例も同じです。

+0

Excellent説明 –

関連する問題