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!
Teşekkürler, bu mükemmel açıklıyor! – Ian
Henüz yapmadıysanız programlama sınıflarını öğretmelisiniz. :) – spirulence
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. –