2017-10-24 5 views
2

質問(S)LuaにおいてLuaの条件式

:Bは、任意のタイプのものであってもよい

local a = b or 0 
local a = b and 1 or 0 

コード行の違いは何ですか? どのような場合にはどちらか一方を使用しますか?


コンテキスト

私は別のサービスにLuaコードを既存のポートを持っていると私は、なぜコードの一部(私はLua開発者ではないよ)で、変数を理解し、問題に遭遇しましたコードの1つの部分と他の部分に割り当てられ、変数は別の部分に割り当てられます。右側の変数は入力パラメータで、目的の型を知る方法がありません。私は

を試してみましたが、何


私はこの上でLuaのドキュメントをオンラインで見て、私はこの上の任意の明確な答えを見つけることができませんでした。

local a1; 
print(type(a1))    -- nil 
local b1 = a1 or 0    
print(b1 .. " " .. type(b1)) -- 0 number 
local c1 = a1 and 1 or 0 
print(c1 .. " " .. type(c1)) -- 0 number 

local a2 = 5 
print(type(a2))    -- number 
local b2 = a2 or 0   
print(b2 .. " " .. type(b2)) -- 5 number 
local c2 = a2 and 1 or 0 
print(c2 .. " " .. type(c2)) -- 1 number 

local a3 = 0 
print(type(a3))    -- number 
local b3 = a3 or 0   
print(b3 .. " " .. type(b3)) -- 0 number 
local c3 = a3 and 1 or 0 
print(c3 .. " " .. type(c3)) -- 1 number 

local a4 = false 
print(type(a4))    -- boolean 
local b4 = a4 or 0 
print(b4 .. " " .. type(b4)) -- 0 number 
local c4 = a4 and 1 or 0 
print(c4 .. " " .. type(c4)) -- 0 number 

local a5 = true 
print(type(a5))    -- boolean 
local b5 = a5 or 0 
print(b5 .. " " .. type(b5)) -- error, concatenating boolean to string 
local c5 = a5 and 1 or 0 
print(c5 .. " " .. type(c5)) -- 1 number 

local a6 = "str" 
print(type(a6))    -- string 
local b6 = a6 or 0 
print(b6 .. " " .. type(b6)) -- str string 
local c6 = a6 and 1 or 0 
print(c6 .. " " .. type(c6)) -- 1 number 

local a7 = "" 
print(type(a7))    -- string 
local b7 = a7 or 0 
print(b7 .. " " .. type(b7)) -- string 
local c7 = a7 and 1 or 0 
print(c7 .. " " .. type(c7)) -- 1 number 

bがブールかnilタイプのものであり、bnilときaが0になるはずであるときand条件付きコードの行のための唯一のユースケースがあるように私には思える:私は私自身のテストを実行しましたまたはfalseであり、bがtrueの場合は1です。

答えて

2

Luaでは、これらは選択演算子であり、短絡評価が行われます。

falseおよびnilは「偽り」です。それ以外の価値は「真実」です。 "falsey"を除いて、オペランドの型は重要ではなく、結果の型は必ずしも"boolean"ではありません。

  • orは、第1の真偽オペランドを選択(返す)する。

  • andは、第1オペランドが偽であればそれを選択し、そうでなければ第2オペランドを選択する。それはorよりも高い優先順位を持ちます。

これは、いくつかのイディオムにつながる:

b or 0 -- default to 0 
t = t or {} -- existing or new, empty table 
b and 1 or 0 -- coerce to 1, defaulting to 0 

あなたの二つの例との違いを、最初は「truthy」bはなりますが、1秒に強制的に変換されます。