2016-03-25 10 views
32

में परिवर्तित करने के लिए कैसे करें मेरे पास एक मूल्य है जो चार चीजों में से एक होगा: बूलियन सत्य, बूलियन झूठी, स्ट्रिंग "सत्य", या स्ट्रिंग "झूठी"। मैं स्ट्रिंग को एक बूलियन में कनवर्ट करना चाहता हूं यदि यह एक स्ट्रिंग है, अन्यथा इसे अनमोडिफाइड छोड़ दें। दूसरे शब्दों में:रूबी: एक स्ट्रिंग को बूलियन

"सही" सच हो जाना चाहिए

"झूठे" झूठे हो जाना चाहिए

सच सच रहना चाहिए

झूठी झूठी रहना चाहिए

+2

क्या परिणाम * दो मानों में से एक होना चाहिए 'सत्य' या 'झूठा' या परिणाम पर्याप्त है या गलत है? यदि उत्तरार्द्ध, तो 'झूठा' पहले से ही झूठा है, और दोनों 'सत्य' और 'सत्य' सत्य हैं, इसलिए एकमात्र मूल्य जिसके लिए नतीजा पहले से सही नहीं है, '' false 'है: 'if input = = 'झूठा' तो सत्य और इनपुट अंत 'इसे करना चाहिए। –

+0

यह एक महान टिप्पणी जोर्ग है, हालांकि मैं मानता हूं कि कुछ अनुप्रयोगों के लिए बूलियन मान सही या गलत होना आवश्यक है और केवल एक मूल्य जो सत्य या गलत नहीं है। – emery

+1

एमरी, यदि आपको एक बुलियन लौटने की ज़रूरत है तो आप दो "नोट्स" के साथ @ जोर्ग की अभिव्यक्ति को पूर्ववत कर सकते हैं: '!! (अगर इनपुट == 'झूठी' तो सत्य और इनपुट अंत)। दूसरा '! 'वापसी मूल्य को एक बूलियन में बदल देता है जो आप चाहते हैं के विपरीत है; पहला '!' तो सुधार करता है। यह "चाल" काफी समय से रहा है। हर कोई इसके शौकीन नहीं है। –

उत्तर

52
: उदाहरण के लिए, यदि आपको संदेह वर "सही", "गलत", 'टी' के किसी भी हो सकता है कि, 'एफ', 'टी', या 'म' है, तो आप रेगुलर एक्सप्रेशन से संशोधित कर सकते हैं
def true?(obj) 
    obj.to_s == "true" 
end 
+0

यह आश्चर्यजनक है, सीएनए कोई बताता है कि यह कैसे काम करता है? – null

+0

हां, @null, to_s विधि बूलियन को सच या गलत "सत्य" या "झूठी" में परिवर्तित करती है और मूल रूप से स्ट्रिंग होने पर मान को अपरिवर्तित छोड़ देता है। अब हम निश्चित रूप से एक स्ट्रिंग के रूप में "सत्य" या "झूठी" होने के लिए निश्चित हैं ... और हमें केवल == जांचने की आवश्यकता है कि स्ट्रिंग "सत्य" के बराबर है या नहीं। यदि ऐसा है तो मूल मान या तो सत्य या "सत्य" था। यदि ऐसा नहीं है तो मूल मान झूठा था, "झूठा", या कुछ पूरी तरह से असंबंधित था। – emery

10
if value.to_s == 'true' 
    true 
elsif value.to_s == 'false' 
    false 
end 
+0

अन्यथा आपको यह जांचना होगा कि यह एक प्रकार का स्ट्रिंग है और यदि हां, तो जांच करें कि यह 'सत्य' है और यदि हां तो सत्य वापस आ जाए। यह सब तुलना क्यों? – archana

+7

आपका कोड एक-लाइनर 'value.to_s == 'true' के रूप में है? सत्य: झूठा' –

+0

यदि/elsif/end शायद शुरुआती के लिए सबसे अधिक पठनीय है। Elsif कथन का उपयोग करते समय to_s को वास्तव में आवश्यक नहीं है, क्योंकि यह "if" या "elsif" के अंतर्गत ब्लॉक को निष्पादित नहीं करेगा जब बूलियन मान स्ट्रिंग से मेल नहीं खाता है, और फिर बूलियन बरकरार रहेगा। – emery

11
h = { "true"=>true, true=>true, "false"=>false, false=>false } 

["true", true, "false", false].map { |e| h[e] } 
    #=> [true, true, false, false] 
1

https://rubygems.org/gems/to_bool जैसे मणि का उपयोग किया जा सकता है, लेकिन इसे आसानी से एक पंक्ति में लिखा जा सकता है एक रेगेक्स या टर्नरी।

regex उदाहरण:

boolean = (var.to_s =~ /^true$/i) == 0 

त्रिगुट उदाहरण:

boolean = var.to_s.eql?('true') ? true : false 

लाभ regex विधि है कि नियमित अभिव्यक्ति लचीले होते हैं और पैटर्न की एक विस्तृत विविधता से मेल कर सकते हैं।

boolean = (var.to_s =~ /^[Tt].*$/i) == 0 
+1

नोट: '\ A' /' \ z' स्ट्रिंग का प्रारंभ/अंत है और '^'/'$' लाइन का प्रारंभ/अंत है।तो अगर 'var ==" true \ nwhatevs "' फिर 'बूलियन == सत्य'। – cremno

3

हालांकि मुझे हैश दृष्टिकोण पसंद है (मैंने इसे अतीत में इसी तरह के सामान के लिए उपयोग किया है), यह देखते हुए कि आप केवल सच्चे मूल्यों से मेल खाने की परवाह करते हैं - क्योंकि - बाकी सब कुछ गलत है - आप किसी सरणी में शामिल करने की जांच कर सकते हैं :

value = [true, 'true'].include?(value) 

या अन्य मूल्यों truthy समझा जा सकता है, तो:

value = [1, true, '1', 'true'].include?(value) 

आप अन्य सामान है जब आपकी मूल value मिलाया जा सकता है मामला कर दिया था: आपकी समस्या के अपने विशिष्ट विवरण के लिए फिर से

value = value.to_s.downcase == 'true' 

लेकिन,, आप अपने समाधान के रूप में है कि पिछले उदाहरण के साथ भाग मिल सकता है ।

1

रेल में, मैं पहले से कुछ इस तरह किया है:

class ApplicationController < ActionController::Base 
    # ... 

    private def bool_from(value) 
    !!ActiveRecord::Type::Boolean.new.type_cast_from_database(value) 
    end 
    helper_method :bool_from 

    # ... 
end 

जो अच्छा है अगर आप के रूप में रेल अपने डेटाबेस के लिए होगा एक ही तरीके से अपने बूलियन तार तुलना मिलान करने के लिए कोशिश कर रहे हैं।

-4

क्या तरह smthing के बारे में:

boolean_str = 'false' 
boolean = eval(boolean_str) 
+4

यदि दुनिया के बाहर से इनपुट आ रहा है तो यह काफी खतरनाक है। –

+0

बाहरी डेटा से कभी भी eval का उपयोग नहीं करें – jacopobeschi

35

आप रेल 5 का उपयोग करते हैं, तो आप ActiveModel::Type::Boolean.new.cast(value) कर सकते हैं।

रेल 4.2 में, ActiveRecord::Type::Boolean.new.type_cast_from_user(value) का उपयोग करें।

व्यवहार थोड़ा अलग है, जैसा कि रेल 4.2 में, वास्तविक मूल्य और झूठे मानों की जांच की जाती है।रेल 5 में, केवल झूठे मानों की जांच की जाती है - जब तक कि मान शून्य न हों या झूठे मूल्य से मेल न हों, यह सच माना जाता है। झूठी मान दोनों संस्करणों में एक ही कर रहे हैं: FALSE_VALUES = [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"]

रेल 5 स्रोत: https://github.com/rails/rails/blob/5-1-stable/activemodel/lib/active_model/type/boolean.rb

+0

यह सहायक है, हालांकि मैं चाहता हूं कि रेल में 'FALSE_VALUES' के सेट में" नहीं "भी शामिल है। – pjrebsch

7

मैं अक्सर करने के लिए मनमाने ढंग से डेटा प्रकार परिवर्तित करने के साथ यह आसान निपटने के लिए बनाने के लिए रूबी के मूल व्यवहार का विस्तार करने के इस पैटर्न का उपयोग किया है

: बूलियन मूल्यों, जो यह वास्तव में अलग-अलग URL पैरामीटर के साथ सौदा करने के लिए आसान बनाता है, आदि

class String 
    def to_boolean 
    ActiveRecord::Type::Boolean.new.cast(self) 
    end 
end 

class NilClass 
    def to_boolean 
    false 
    end 
end 

class TrueClass 
    def to_boolean 
    true 
    end 

    def to_i 
    1 
    end 
end 

class FalseClass 
    def to_boolean 
    false 
    end 

    def to_i 
    0 
    end 
end 

class Integer 
    def to_boolean 
    to_s.to_boolean 
    end 
end 

तो मान लीजिए कि आप एक पैरामीटर foo जो किया जा सकता है चलो 0

  • एक पूर्णांक (0 गलत है, अन्य सभी सत्य हैं)
  • एक सच्चे बूलियन (सही/गलत)
  • एक स्ट्रिंग ("सही", "गलत", "0", "1", " सही "," गलत ")
  • शून्य

इसके बजाय सशर्त, का एक समूह का उपयोग कर के, तो आप सिर्फ foo.to_boolean कॉल कर सकते हैं और यह आपके लिए जादू के बाकी करेंगे।

रेल में, मैं इसे लगभग सभी परियोजनाओं में core_ext.rb नामक प्रारंभकर्ता में जोड़ता हूं क्योंकि यह पैटर्न इतना आम है।

## EXAMPLES 

nil.to_boolean  == false 
true.to_boolean == true 
false.to_boolean == false 
0.to_boolean  == false 
1.to_boolean  == true 
99.to_boolean  == true 
"true".to_boolean == true 
"foo".to_boolean == true 
"false".to_boolean == false 
"TRUE".to_boolean == true 
"FALSE".to_boolean == false 
"0".to_boolean  == false 
"1".to_boolean  == true 
true.to_i   == 1 
false.to_i   == 0 
6

बहुत ज्यादा मत सोचो:

bool_or_string.to_s == "true" 

तो,

"true".to_s == "true" #true 
"false".to_s == "true" #false 
true.to_s == "true"  #true 
false.to_s == "true" #false 

तुम भी जोड़ सकते हैं ".downcase," यदि आप बड़े अक्षरों के बारे में चिंतित हैं।

+1

'nil.to_s == 'true' # false' – juliangonzalez

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