आपकी समस्या 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
क्यों नहीं लिखा, और यह गलत अभिव्यक्ति क्या बदलेगी!
धन्यवाद, यह पूरी तरह से बताता है! – Ian
यदि आप पहले से नहीं हैं तो आपको प्रोग्रामिंग कक्षाएं पढ़नी चाहिए। :) – spirulence
मुझे लुआ के बारे में बहुत कुछ पता नहीं है, लेकिन शायद आपको यह उल्लेख करना चाहिए कि डी मॉर्गन के कानून के आपके संदर्भ के संबंध में कोई भी 'अगर नहीं (x == 1 या x == 0) तो' का उपयोग कर सकता है। –