2012-07-25 14 views
13

Bir değişkenin bu veya bunun eşit DEĞİL olduğunu doğrulamaya çalışıyorum. Aşağıdaki kodları kullanmayı denedim, ancak hiçbiri işe yaramıyor:Bu veya buna eşit değil 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 

Bunu yapmanın bir yolu var mı?

test sadece iki değerleri için

cevap

37

Senin sorunun böyle programlama dilleri öğrenme insanların ortak or operatörün yanlış anlaşılmasından kaynaklanır. Evet, acil sorununuz x ~= 0 and x ~= 1 yazılarak çözülebilir, ancak denediğiniz çözümün neden işe yaramadığı hakkında biraz daha ayrıntılı bilgi alacağım.

x ~=(0 or 1) veya x ~= 0 or 1'u okuduğunuzda, "x sıfıra eşit değil veya bir" ifadesiyle bunu ayrıştırmak doğaldır. Bu ifadenin sıradan anlayışında, "x" özne, "eşit değildir" ifadesi veya fiil ifadesidir ve "sıfır veya bir" nesnesi, bir birleşim ile birleştirilen bir olasılık kümesidir. Nesneyi, fiildeki fiili her bir öğeye uygularsınız. Bununla birlikte, Lua bunu İngilizce dilbilgisi kurallarına dayanarak ayrıştırmaz, işlem sırasına göre iki öğenin ikili karşılaştırmasıyla ayrıştırır. Her operatörün değerlendirileceği sırayı belirleyen bir precedence vardır. or, matematiğe ekleme çarpmadan daha düşük bir önceliğe sahip olduğu için ~='dan daha düşük bir önceliğe sahiptir. Her şeyin parantezden daha düşük bir önceliği vardır. Sonuç, x ~=(0 or 1) değerlendirirken, tercüman ilk (çünkü parantez) 0 or 1 ve sonra x ~= birinci hesaplama sonucu hesaplamak olacak ve ikinci örnekte, x ~= 0 hesaplamak ve sonra sonucunu uygulanacaktır gibi

or 1 için bu hesaplama.

logical operator or "Bu değer nil ve false'den farklıysa ilk argümanını döndürür; aksi takdirde ikinci argümanını döndürür". relational operator ~=, eşitlik operatörü =='un tersidir; argümanları farklı tiplerse (x bir sayı, sağa mı?) true değerini döndürür ve argümanlarını normal olarak karşılaştırır. Bu kurallar kullanılarak

, x ~=(0 or 1) (or operatör uygulandıktan sonra) x ~= 0 bozunacaktır ve x, istenmeyen bir 1 'de dahil olmak üzere 0 dışında bir şey ise, bu 'gerçek' döndürecektir. Diğer form, x ~= 0 or 1 ilk önce x ~= 0 (x değerine bağlı olarak doğru veya yanlış döndürebilir) değerlendirecektir.Daha sonra, false or 1 veya true or 1'dan birine ayrılacaktır. İlk durumda, ifade 1 dönecek ve ikinci durumda, ifade true dönecektir. Lua'daki denetim yapıları yalnızca nil ve false öğelerinin yanlış olduğunu ve herhangi bir şeyin doğru olduğunu düşündüğünden, bu her zaman istediğiniz gibi olmayan if ifadesine girer.

Tek bir değişkeni bir değerler listesiyle karşılaştırmak için programlama dillerinde sağlananlar gibi ikili operatörleri kullanmanın bir yolu yoktur. Bunun yerine, değişkeni her bir değere tek tek karşılaştırmanız gerekir. Bunu yapmanın birkaç yolu var.

if x ~= 1 and x ~= 0 then 
    print("X must be equal to 1 or 0") 
    return 
end 
: basit yolu trivially ikili operatörleri ile yazılabilir 'değil bir değil sıfır' olarak (ikili operatörleri ile değerlendirilemez) deyimi 'değil, bir veya sıfır' ifade etmek De Morgan's laws kullanmaktır istemediğiniz (o x aralığında bir tamsayı olduğu sınamak sonra bir dizi kontrol ve ilişkisel operatörler kullanabilir, Nihayet

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 

:

Alternatif olarak, bu değerleri kontrol etmek için bir döngü kullanabilirsiniz 0.5, sağ?)

if not (x >= 0 and x <= 1 and math.floor(x) == x) then 
    print("X must be equal to 1 or 0") 
    return 
end 

Not yazdığım x >= 0 and x <= 1. Yukarıdaki açıklamayı anladıysanız, şimdi neden 0 <= x <= 1 yazmamış olduğumu ve bu hatalı ifadenin ne geri döneceğini açıklayabilmelisiniz!

+0

Teşekkürler, bu mükemmel açıklıyor! – Ian

+2

Henüz yapmadıysanız programlama sınıflarını öğretmelisiniz. :) – spirulence

+1

Lua hakkında fazla bir şey bilmiyorum, ama belki de De Morgan yasasından bahsetmişken, '' (x == 1 ya da x == 0) 'ifadesini de kullanabileceğinizi söylemelisiniz. –

8

, ben şahsen bu yapardım: ikiden fazla değerlerine karşı test etmek gerekirse, ben bir seti gibi davranan bir tabloda seçimlerinizi şeyler olur

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

gibi böylece:

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) aynıdır (x ~= 0) aynıdır. Bunun yerine, bunun gibi bir şey deneyebilirsiniz.

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

print(isNot0Or1(-1) == true) 
print(isNot0Or1(0) == false) 
print(isNot0Or1(1) == false)