あなたの問題は、このようなプログラミング言語を学ぶ人に共通するor
オペレータの誤解から生じています。はい、即時の問題はx ~= 0 and x ~= 1
と書くことで解決できますが、試行した解決策が機能しない理由について少し詳しく説明します。
x ~=(0 or 1)
またはx ~= 0 or 1
を読むときは、「xは0または1と等しくない」という文章と同じように解析するのが自然です。その文の通常の理解では、「x」は主語であり、「is not equal」は述語または動詞句であり、「0または1」がオブジェクトであり、連接によって結合される可能性の集合である。セット内の各項目に動詞付きのサブジェクトを適用します。
しかし、Luaは英語の文法の規則に基づいてこれを解析せず、2つの要素をその演算順序に基づいてバイナリ比較して解析します。各演算子には、評価する順序を決定するprecedenceがあります。 or
の優先度は~=
よりも低く、数学の加算は乗算よりも優先度が低いためです。すべてがかっこより優先度が低くなります。その結果、x ~=(0 or 1)
を評価するとき、インタプリタは最初(なぜなら括弧の)0 or 1
、次いでx ~=
第1の演算の結果を計算し、第二の例では、それはx ~= 0
を計算した後の結果を適用するように
その計算はor 1
になります。
「logical operator or
」は、この値がnilおよびfalseと異なる場合は最初の引数を返し、それ以外の場合は2番目の引数を返します。 relational operator ~=
は、等価演算子==
の逆です。その引数が異なる型(x が数字の場合は)の場合はtrueを返し、そうでない場合はその引数を通常と比較します。これらのルールを使用して
、x ~=(0 or 1)
は(or
オペレータを適用した後)x ~= 0
に分解され、xは望ましくない1を含む0以外、であれば、これは「真」を返します。他の形式のx ~= 0 or 1
は、最初にx ~= 0
(xの値に応じてtrueまたはfalseを返す可能性があります)を評価します。その後、false or 1
またはtrue or 1
のいずれかに分解されます。最初のケースでは、文は1
を返し、2番目のケースでは文はtrue
を返します。 Luaの制御構造は、nil
とfalse
を偽とみなし、それ以外の場合は常にif
というステートメントを入力します。これはどちらのステートメントでもありません。
プログラミング言語で提供されているようなバイナリ演算子を使用して、単一の変数を値のリストと比較する方法はありません。代わりに、変数をそれぞれの値と比較する必要があります。これを行うにはいくつかの方法があります。最も簡単な方法は、「しない一方とゼロでない」として(二項演算子を用いて評価することができない)ステートメント「ではない1または0」を表現するためにDe Morgan's lawsを使用することである些細な二項演算子で記述することができる。
if x ~= 1 and x ~= 0 then
print("X must be equal to 1 or 0")
return
end
代わりに、これらの値をチェックするためにループを使用することができます。
local x_is_ok = false
for i = 0,1 do
if x == i then
x_is_ok = true
end
end
if not x_is_ok then
print("X must be equal to 1 or 0")
return
end
最後に、あなたは(あなたがしたくない範囲をチェックして、xは範囲内の整数であったことをテストするために、関係演算子を使用することができます0.5、右?)
if not (x >= 0 and x <= 1 and math.floor(x) == x) then
print("X must be equal to 1 or 0")
return
end
私はx >= 0 and x <= 1
を書きました。上記の説明を理解していれば、なぜ私は0 <= x <= 1
と書かなかったのか、そしてこの誤った表現が何を返すのか説明できるはずです。
ありがとう、それは完全にそれを説明する! – Ian
プログラミングクラスを教えてください。 :) – spirulence
私はLuaについてはあまりよく分かりませんが、De Morganの法則についてのあなたの言及に関連して、 'そうでなければ(x == 1またはx == 0)then'を使用することができるかもしれません。 –