2012-04-26 3 views
5

क्या कोई रूबी विधि है जो एक स्ट्रिंग और डिफ़ॉल्ट मान लेती है और स्ट्रिंग को पूर्णांक में परिवर्तित करती है या अन्यथा डिफ़ॉल्ट मान देता है?डिफ़ॉल्ट मान के साथ रूबी स्ट्रिंग को इंटीजर में कनवर्ट करें

अद्यतन मुझे लगता है कि निम्नलिखित जवाब बेहतर है: कोड करने के लिए अपने आप को कि, संभवतः एक का उपयोग कर

> def time; t = Time.now; yield; Time.now - t end 

> time { 1000000.times { |i| ('_' << i.to_s) =~ /\d+/ } } 
=> 1.3491532 
> time { 1000000.times { |i| Integer.new('_' << i.to_s) rescue nil } } 
=> 27.190596426 
+0

"पूर्णांक युक्त" से आपका क्या मतलब है? –

+0

'" समयपूर्व अनुकूलन सभी बुराइयों की जड़ है "' - डोनाल्ड Knuth – Reactormonk

उत्तर

2

आप होगा:

class String 
    def try_to_i(default = nil) 
    /^\d+$/ === self ? to_i : default 
    end 
end 

यहाँ सबूत तुम क्यों अपवाद से बचना चाहिए है स्ट्रिंग की जांच करने के लिए नियमित अभिव्यक्ति:

def try_to_i(str, default = nil) 
    str =~ /^-?\d+$/ ? str.to_i : default 
end 
+0

नकारात्मक संख्याओं के बारे में क्या? – Reactormonk

+0

@ टास: इसे इंगित करने के लिए धन्यवाद :) –

8

कन्वर्ट करने के लिए #to_i और Integer() है। पहले में 0 का डिफ़ॉल्ट है, दूसरा दूसरा ArgumentError उठाता है।

class String 
    def to_integer(default) 
    Integer(self) 
    rescue ArgumentError 
    default 
    end 
end 
+0

मुझे लगता है कि सामान्य उपयोग के मामलों के लिए अपवादों का उपयोग करना बहुत अधिक प्रदर्शन ओवरहेड – Alexey

+0

है मुझे यह मानना ​​है कि यह अधिक सुरुचिपूर्ण समाधान है और इसे स्वीकार किया जाना चाहिए। मैंने केवल यह सुझाव नहीं दिया क्योंकि मुझे 'इंटीजर() 'के बारे में पता नहीं था। @Alexey: नौकरी के लिए एक regex का उपयोग करने के ऊपर की ओर भी और अधिक समस्याग्रस्त है। –

+0

निकलास, – Alexey

-1

आप कुछ इस तरह कर सकता है:

int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value 

कि अगर स्ट्रिंग अंक की पूरी तरह से बना है देखेंगे, और यदि ऐसा है तो, जे, या अपने डिफ़ॉल्ट मान देने के लिए कनवर्ट करें।

+0

प्रश्न में अद्यतन देखें रूबी के पास '?:' है, तो अविश्वसनीय '&& ... का उपयोग क्यों करें ... मुहावरे? –

+0

आईएमओ, यह टर्नरी ऑपरेटर का उपयोग करने के बजाय, पूर्णांक मामले को पूर्णांक केस में बंडल करने के लिए अधिक अवधारणात्मक लगता है। साथ ही, &&/|| कैसे है अविश्वसनीय? निश्चित रूप से, प्राथमिकता का मुद्दा है यदि आप उनके लिखित शब्द समकक्ष ऑपरेटरों (या/और) के बीच स्विच करते हैं, लेकिन लगातार उपयोग उस को समाप्त करता है। जो कुछ भी कहा, यह आपके ऊपर है - अगर टर्नरी आपकी शैली के अनुरूप है, तो इसके लिए जाओ। –

+0

मेरा मतलब यह था कि आपको हमेशा दो बार सोचना पड़ता है यदि '&&' और '||' के बीच का हिस्सा 'झूठा' या 'शून्य 'हो सकता है, इस स्थिति में यह सशर्त ऑपरेटर या' if .. के बराबर नहीं है। फिर .. else'। इस मामले में यह ठीक है क्योंकि 'to_i' हमेशा एक पूर्णांक मान देता है। बीटीडब्ल्यू, आपके उदाहरण में कोष्ठक की आवश्यकता नहीं है। –

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