2012-07-25 5 views
13

私は変数がこれと同じでないことを確認しようとしています。私は次のコードを使ってみましたが、どちらも動作しません:これと同じではない、またはLuaでの意味

if x ~=(0 or 1) then 
    print("X must be equal to 1 or 0") 
    return 
end 


if x ~= 0 or 1 then 
    print("X must be equal to 1 or 0") 
    return 
end 

これを行う方法はありますか?

答えて

37

あなたの問題は、このようなプログラミング言語を学ぶ人に共通する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の制御構造は、nilfalseを偽とみなし、それ以外の場合は常に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と書かなかったのか、そしてこの誤った表現が何を返すのか説明できるはずです。

+0

ありがとう、それは完全にそれを説明する! – Ian

+2

プログラミングクラスを教えてください。 :) – spirulence

+1

私はLuaについてはあまりよく分かりませんが、De Morganの法則についてのあなたの言及に関連して、 'そうでなければ(x == 1またはx == 0)then'を使用することができるかもしれません。 –

8

2つだけの値をテストするために、私は個人的にこれを行うだろう:

if x ~= 0 and x ~= 1 then 
    print("X must be equal to 1 or 0") 
    return 
end 

あなたが二つ以上の値に対してテストする必要がある場合は、私は以下のように、セットのような演技の表に選択肢を詰め込むと思いますそう:

choices = {[0]=true, [1]=true, [3]=true, [5]=true, [7]=true, [11]=true} 

if not choices[x] then 
    print("x must be in the first six prime numbers") 
    return 
end 
3

x ~= 0 or 1((x ~= 0) or 1)

x ~=(0 or 1)と同じであるが(x ~= 0)と同じです。

代わりにこのようなものを試してください。

function isNot0Or1(x) 
    return (x ~= 0 and x ~= 1) 
end 

print(isNot0Or1(-1) == true) 
print(isNot0Or1(0) == false) 
print(isNot0Or1(1) == false) 
関連する問題