अगर रूबी ऑब्जेक्ट बूलियन है तो कैसे जांचें


122

मुझे लगता है कि एक वस्तु आसानी से बूलियन है की जाँच करने के लिए प्रतीत नहीं कर सकते। क्या रूबी में ऐसा कुछ है?

true.is_a?(Boolean)
false.is_a?(Boolean)

अभी मैं यह कर रहा हूं और इसे छोटा करना चाहता हूं:

some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))

जवाबों:


136

सबसे सरल तरीका जो मैं सोच सकता हूं:

# checking whether foo is a boolean
!!foo == foo

6
कक्षा X; हार; आत्म अंत; x = X.new; !! x == x # => सच
एलेक्सी

5
हां, इसे बतख टाइपिंग और OOP का मुख्य सिद्धांत कहा जाता है। मुझे लगता है कि यह एक विशेषता है।
कोन्स्टेंटिन हासे

62
जरूरी नहीं कि शॉर्ट का मतलब सरल हो। जिससे मेरा मतलब है, wtf वह है?
ग्रांट बर्चमियर

11
फू को बूलियन में बदल देता है, जाँच करता है कि क्या फू के समान है।
कॉन्सटेंटिन हासे

9
ध्यान दें कि कुछ चेकर्स (जैसे RuboCop ) द्वारा दोहरी नकार को गलत शैली माना जाता है ।
sschuberth

104

मुझे यह संक्षिप्त और स्व-दस्तावेजीकरण लगता है:

[true, false].include? foo

यदि रेल या ActiveSupport का उपयोग कर रहे हैं, तो आप सीधे क्वेरी का उपयोग भी कर सकते हैं in?

foo.in? [true, false]

सभी संभावित मूल्यों के खिलाफ जाँच करना कुछ ऐसा नहीं है जो मैं फ़्लोट के लिए सुझाऊंगा, लेकिन संभव है जब केवल दो संभावित मान हों!


1
अब तक का सबसे अच्छा जवाब, हालांकि मुझे यह भी पसंद आया foo == true or foo == falseकि किसी ने एक टिप्पणी की।
रयान टेलर

3
मुझे यह पसंद है क्योंकि यह इरादे से कम गूढ़ है !!foo == foo
स्ट्रिंग्सन्हुकीज

सर्वथा निर्विकार! निश्चित रूप से अब तक का सबसे अर्थपूर्ण उत्तर।
जेएम जेनजन

85

कोई भी नहीं है Booleanरूबी में वर्ग, जांच करने के लिए एक ही रास्ता है कि तुम क्या कर रहे हैं (के खिलाफ वस्तु की तुलना करने के लिए है trueऔर falseया के खिलाफ वस्तु के वर्ग TrueClassऔर FalseClass)। सोच नहीं सकते कि आपको इस कार्यक्षमता की आवश्यकता क्यों होगी, क्या आप समझा सकते हैं? :)

यदि आपको वास्तव में इस कार्यक्षमता की आवश्यकता है, तो आप इसे हैक कर सकते हैं:

module Boolean; end
class TrueClass; include Boolean; end
class FalseClass; include Boolean; end

true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true

1
वर्तमान मान के आधार पर टाइपकास्टिंग करने की कोशिश कर रहा है।
लांस पोलार्ड

75
'तुम कभी ऐसा क्यों करोगे?' (और डेरिवेटिव) सबसे कष्टप्रद सवालों में से एक है जो एक इंजीनियर एक और कर सकता है :)
वीएमवी

11
+1 क्योंकि मैं की तरह rspec में इस का उपयोग कर सकते हैं:expect(some_method?(data)).to be_a(Boolean)
Automatico

3
अन्य प्रकार जब चेक प्रकार की आवश्यकता होती है, तब होता है जब आप डेटाबेस एडॉप्टर को लागू करते हैं और इसके साथ रैप स्ट्रिंग्स की आवश्यकता होती है, "quotes"लेकिन संख्या और
बूलियन

23

जैसा कि ऊपर कहा गया है कि कोई भी बूलियन वर्ग नहीं है सिर्फ TrueClass और FalseClass हालांकि आप किसी भी वस्तु का उपयोग कर सकते हैं, यदि वह तब तक / जब तक और FalseClass और nil के उदाहरणों को छोड़कर सब कुछ सत्य है

बूलियन परीक्षण फालसेक्लास या ट्रूक्लास का एक उदाहरण देते हैं

(1 > 0).class #TrueClass

निम्नलिखित मंकीपैक टू ऑब्जेक्ट आपको बताएगा कि क्या कुछ TrueClass या FalseClass का उदाहरण है

class Object
  def boolean?
    self.is_a?(TrueClass) || self.is_a?(FalseClass) 
  end
end

Irb के साथ कुछ परीक्षण चलाने से निम्नलिखित परिणाम मिलते हैं

?> "String".boolean?
=> false
>> 1.boolean?
=> false
>> Time.now.boolean?
=> false
>> nil.boolean?
=> false
>> true.boolean?
=> true
>> false.boolean?
=> true
>> (1 ==1).boolean?
=> true
>> (1 ==2).boolean?
=> true

4
बस लिखने के लिए सरल self == true or self == false। यह TrueClass और FalseClass का एकमात्र उदाहरण हैं।
चक

@chuck जो Time.now.boolean को छोड़कर समान परिणाम देता है? जो शून्य हो जाता है। कोई विचार क्यों?
स्टीव वेट

विधि में स्वयं पर एक कक्षा की जांच को परिभाषित करना कुछ हद तक नहीं है। आपको दो संस्करणों को परिभाषित करना चाहिए boolean, एक TrueClass / FalseClass के लिए और एक ऑब्जेक्ट के लिए।
कोन्स्टेंटिन हासे

4
कारण यह है कि Time#==रूबी 1.8 के संस्करण में एक बग झूठे के बजाय शून्य वापस करने के लिए गैर-समय मूल्यों की तुलना का कारण बनता है।
चक

17

यदि आपका कोड समझदारी से केस स्टेटमेंट के रूप में लिखा जा सकता है, तो यह बहुत ही सभ्य है:

case mybool
when TrueClass, FalseClass
  puts "It's a bool!"
else
  puts "It's something else!"
end

6

एक वस्तु जो एक बूलियन होती है, उसके पास या तो TrueClass या FalseClass का एक वर्ग होगा, इसलिए निम्न एक-लाइनर को ट्रिक करना चाहिए

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true

निम्नलिखित आपको सही / गलत बूलियन प्रकार का चेक परिणाम भी देगा

mybool = true    
[TrueClass, FalseClass].include?(mybool.class)
=> true

4

तो यह (x == true) ^ (x == false)ध्यान दें कि आपको कोष्ठक की आवश्यकता है लेकिन यह अधिक सुंदर और कॉम्पैक्ट है।

यहां तक ​​कि "क्यूक" जैसा सुझाव भी दिया जाता है, लेकिन "क्यूक" नहीं ... class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)

नोट : देखें कि यह इतना बुनियादी है कि आप इसे अन्य भाषाओं में भी उपयोग कर सकते हैं, जो "चीज़ बूलियन" प्रदान नहीं करता है।

नोट 2 : इसके अलावा, आप यह कहने के लिए इसका उपयोग कर सकते हैं कि एक है ??:"red", "green", "blue"यदि आपadd more XORS... या कहें कि यह चीज़ एक है ??:4, 5, 8, 35


क्यों XOR? क्यों नहीं या?
नाकिलन

2

यह रत्न उपयोगी तरीकों के साथ रूबी में एक बूलियन वर्ग जोड़ता है।

https://github.com/RISCfuture/boolean

उपयोग:

require 'boolean'

फिर आपकी

true.is_a?(Boolean)
false.is_a?(Boolean)

आपकी अपेक्षा के अनुरूप काम करेगा।


0

नहीं, जैसे आपके पास अपना कोड नहीं है। बूलियन नाम का कोई वर्ग नहीं है। अब आपके पास सभी उत्तरों के साथ आपको एक बनाने और इसका उपयोग करने में सक्षम होना चाहिए। तुम्हें पता है कि कैसे कक्षाएं बनाने के लिए आप नहीं है? मैं केवल यहां आया क्योंकि मैं सिर्फ इस विचार को सोच रहा था। कई लोग कह सकते हैं "क्यों? आपको बस यह जानना होगा कि रूबी बुलियन का उपयोग कैसे करती है"। यही कारण है कि आपको जो जवाब मिले, वह आपको मिले। तो सवाल के लिए धन्यवाद। सोच के लिए भोजन। रूबी के पास बूलियन क्लास क्यों नहीं है?

NameError: uninitialized constant Boolean

ध्यान रखें कि वस्तुओं के प्रकार नहीं हैं। वे वर्ग हैं। वस्तुओं में डेटा है। इसलिए जब आप कहते हैं कि डेटा प्रकार यह एक मिथ्या नाम है।

रैंड 2 भी आज़माएं क्योंकि रैंड 1 हमेशा देता है 0. रैंड 2 कुछ समय में 1 या 0 रन देगा। https://repl.it/IOPx/7

हालाँकि मुझे नहीं पता होगा कि मैं खुद बूलियन क्लास कैसे बना सकता हूँ। मैंने इसके साथ प्रयोग किया है लेकिन ...

class Boolean < TrueClass
  self
end

true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false

कम से कम हमारे पास अभी वह वर्ग है लेकिन कौन जानता है कि सही मूल्य कैसे प्राप्त करें?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.