2012-07-25 14 views
13

मैं यह सत्यापित करने की कोशिश कर रहा हूं कि एक चर या तो इसके बराबर नहीं है। मैं निम्नलिखित कोड का उपयोग करने की कोशिश, लेकिन न तो काम करता है:इस के बराबर नहीं है या लूआ

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 

वहाँ यह करने के लिए कोई तरीका है? जैसे

if x ~= 0 and x ~= 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 शून्य या एक के बराबर नहीं है"। उस कथन की सामान्य समझ में, "एक्स" विषय है, "बराबर नहीं है" भविष्यवाणी या क्रिया वाक्यांश है, और "शून्य या एक" वस्तु है, संयोजन के साथ संभावनाओं का एक सेट है। आप इस विषय को सेट में प्रत्येक आइटम को क्रिया के साथ लागू करते हैं।

हालांकि, लुआ अंग्रेजी व्याकरण के नियमों के आधार पर इसका विश्लेषण नहीं करता है, यह संचालन के आदेश के आधार पर दो तत्वों की द्विआधारी तुलना में इसे पार करता है। प्रत्येक ऑपरेटर के पास precedence होता है जो उस क्रम को निर्धारित करता है जिसमें उसका मूल्यांकन किया जाएगा। or~= से कम प्राथमिकता है, जैसे गणित में गुणा के मुकाबले कम प्राथमिकता है। सब कुछ कोष्ठक की तुलना में कम प्राथमिकता है।

परिणामस्वरूप, x ~=(0 or 1) का मूल्यांकन, दुभाषिया पहले की गणना करेगा 0 or 1 (कोष्ठकों की वजह से) और फिर x ~= पहले गणना का परिणाम है, और दूसरे उदाहरण में, यह x ~= 0 गणना और उसके बाद के परिणाम के रूप में लागू होगी or 1 पर गणना।

logical operator or "यह मान अपना पहला तर्क देता है यदि यह मान शून्य और झूठ से अलग है, अन्यथा, या अपना दूसरा तर्क देता है"। relational operator ~= समानता ऑपरेटर == के विपरीत है; यह सच होता है यदि उसके तर्क अलग-अलग प्रकार हैं (x एक संख्या है, है ना?), और अन्यथा सामान्य रूप से इसके तर्कों की तुलना करता है।

इन नियमों का उपयोग करना, x ~=(0 or 1)x ~= 0 को विघटित होगा (or ऑपरेटर लागू करने के बाद) और इस वापस आ जाएगी 'सही' अगर एक्स 0 के अलावा और कुछ, 1 है, जो अवांछनीय है भी शामिल है। अन्य फॉर्म, x ~= 0 or 1 पहले x ~= 0 का मूल्यांकन करेगा (जो x के मान के आधार पर सत्य या गलत हो सकता है)।फिर, यह false or 1 या true or 1 में से एक को विघटित कर देगा। पहले मामले में, कथन 1 लौटाएगा, और दूसरे मामले में, कथन true लौटाएगा। चूंकि लुआ में नियंत्रण संरचना केवल nil और false पर झूठी होने पर विचार करती है, और कुछ भी सत्य होने के लिए, यह हमेशा if कथन दर्ज करेगा, जो आप चाहते हैं कि वह नहीं है।

कोई तरीका नहीं है कि आप प्रोग्रामिंग भाषाओं में प्रदान किए गए बाइनरी ऑपरेटरों का उपयोग कर सकते हैं ताकि वे एक वैरिएबल की तुलना मूल्यों की सूची में कर सकें। इसके बजाय, आपको वैरिएबल की तुलना प्रत्येक मान को एक-एक करके करने की आवश्यकता है। ऐसा करने के कुछ तरीके हैं। सबसे आसान तरीका 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 

अंत में, आप एक सीमा जाँच करने के लिए और फिर संबंधपरक ऑपरेटर इस्तेमाल कर सकते हैं परीक्षण है कि एक्स श्रेणी में एक पूर्णांक था (आप नहीं चाहते 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

मुझे लुआ के बारे में बहुत कुछ पता नहीं है, लेकिन शायद आपको यह उल्लेख करना चाहिए कि डी मॉर्गन के कानून के आपके संदर्भ के संबंध में कोई भी 'अगर नहीं (x == 1 या x == 0) तो' का उपयोग कर सकता है। –

8

परीक्षण केवल दो मानों के लिए, मैं व्यक्तिगत रूप से ऐसा करने चाहते हैं इसलिए:

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) 
संबंधित मुद्दे