2012-11-09 20 views
8

अन्य प्रकार के चर के लिए, मैं ||= का उपयोग करता हूं, लेकिन यह बूलियन के लिए काम नहीं करता है (x ||= true एक्स को सत्य को असाइन करता है भले ही एक्स को पहले झूठा सौंपा गया हो)।रूबी में आप बूलियन डिफ़ॉल्ट मान कैसे सेट करते हैं?

मैंने सोचा था कि यह काम करेगा:

x = true unless defined?(x) 

लेकिन यह नहीं है: यह किसी कारण के लिए प्रदान करती है x करने के लिए नहीं के बराबर। (यहाँ एक व्याख्या की सराहना किया जाएगा।)

मैं एक विधि है कि काम करता है पता है:

unless defined?(x) 
    x = true 
end 

लेकिन यह नहीं बल्कि अत्यधिक शब्द है। रूबी में बूलियन चर के लिए डिफ़ॉल्ट मान असाइन करने का एक और संक्षिप्त तरीका है?

+0

वहाँ एक कारण है कि आप एक्स शून्य (जो सभी इरादे और प्रयोजनों के लिए झूठे के बराबर है) को सौंपा जा नहीं करना चाहती है? –

+0

@ sylvain.joyeux क्योंकि वह चाहता है कि यह 'सत्य' हो, झूठी नहीं। –

+0

@ sylvain.joyeux झूठी जगह के बजाय शून्य का उपयोग करना ठीक है, लेकिन यह '|| =' के साथ परेशानी का समाधान नहीं करता है। यदि आप '|| =' का उपयोग कर x के लिए डिफ़ॉल्ट मान असाइन करने का प्रयास करते हैं, और x को पहले शून्य पर असाइन किया गया था, तो यह शून्य के मान को बनाए रखने के बजाय ओवरराइड किया जाएगा (क्योंकि शून्य गलत है)। – evanrmurphy

उत्तर

10

आप defined?पहले होना आवश्यक है, और पार्सर x = तक पहुँच जाता है और फिर परिभाषित करता है x (जो यह बनाता है nil) unless चलाने से पहले:

defined?(x) or x = true 
x #=> true 
x = false 
defined?(x) or x = true 
x #=> false 

एक if/unless ब्लॉक कर (if/unless एक-लाइनर के बाद) भी काम करता है:

unless defined?(x) 
    x = true 
end 
x #=> true 
x = false 
unless defined?(x) 
    x = true 
end 
x #=> false 
+0

आपने मुझे एक बार फिर से [पंच] को हरा दिया [http://stackoverflow.com/questions/12614805/weird-ruby-behaviour/12615158#12615158) एक बार फिर एक बेहतर स्पष्टीकरण के साथ। – sunnyrjuneja

+0

@ सुनी जुनेजा मुझे पता था कि मैंने हाल ही में इस बारे में कुछ लिखा होगा ... –

+0

धन्यवाद, एंड्रयू। परिभाषित? (एक्स) या एक्स = सच 'महान काम करता है। – evanrmurphy

1

रूबी में केवल दो गैर-सत्य मान हैं: false और nil। आपको बस इतना करना है कि उन लोगों के बीच अंतर हो। जब तक नए //= ऑपरेटर कि यह स्वचालित रूप से करता है के आसपास आता है, तो आप इस के साथ फंस रहे हैं:

if (x.nil?) 
    x = true 
end 

उम्मीद है कि इस माणिक के भविष्य के संस्करणों में संक्षिप्त जा सकता है। 99% जब आप वास्तव में दो गैर-सत्य मूल्यों के बीच अंतर की परवाह नहीं करते हैं, लेकिन आपके द्वारा किए जाने वाले 1% समय में असामान्य रूप से वर्बोज़ होने के लिए परेशान हो जाता है।

याद रखें कि defined? ऑपरेटर हमेशा उस स्थिति के लिए "local-variable" लौटाएगा क्योंकि परिवर्तनीय x स्थानीय चर के रूप में "परिभाषित" है। defined?(nope) के साथ तुलना करें और आपको nil मिलेगा क्योंकि यह चर मौजूद नहीं है। रुबी चर या स्थिर में निरंतर से संबंधित है, भले ही वह चर या स्थिर परिभाषित किया गया हो।

+4

या 'x = true अगर x.nil?', जो मेरे लिए '|| = 'idiom की तुलना में अधिक पठनीय है! – Gene

+0

मुझे पता है कि यह स्पष्ट प्रतीत हो सकता है लेकिन आपको अपने कोड में कहीं भी 'x' होना चाहिए क्योंकि' कक्षा ए; def self.check; अगर x.nil?; एक्स = सच; समाप्त; समाप्त; समाप्त; एचेक; 'एक 'अपरिभाषित स्थानीय चर' अपवाद वापस कर देगा। – sunnyrjuneja

+0

पोस्टर के कोटेक्स्ट के आधार पर, यह वास्तव में गलत हो सकता है। यदि आप इसे आईआरबी में करते हैं, तो यह एक 'अपरिभाषित स्थानीय चर' अपवाद का कारण बनता है जहां काम करने वाला उदाहरण पोस्टर 'x = true' निर्दिष्ट नहीं करता है और असाइन करता है। – sunnyrjuneja

-1
x = defined?(x) ? true : false 
+0

-1 यह 'x' 'झूठा' होगा, भले ही यह पहले से ही 'सत्य' था। –

+0

@AndrewMarshall क्या आप कहने का मतलब था कि यह 'x'' सत्य होगा, भले ही यह पहले से ही 'झूठा' था? – evanrmurphy

+0

@evanrmurphy हां, मैंने दोनों को उलट दिया। –

संबंधित मुद्दे