2012-09-14 10 views
23

मेरे पास रूबी में एक स्ट्रिंग है जिस पर मैं अग्रणी और पिछली सफेद जगह को हटाने के लिए स्ट्रिप विधि को बुला रहा हूं। जैसेरूबी चेकिंग विधि से पहले शून्य अगर

s = "12345 " 
s.strip 

लेकिन अगर स्ट्रिंग खाली है मैं निम्नलिखित त्रुटि मिलती है।

NoMethodError: अपरिभाषित विधि `स्ट्रिप 'शून्य के लिए: NilClass

मैं अगर मूल्य पट्टी विधि कॉल करने से पहले नहीं के बराबर है तो क्या सबसे आसान तरीका है की जाँच करने के रूबी 1.9 का उपयोग कर रहा हूँ?

अद्यतन:

मैं एक सरणी में एक तत्व पर इस कोशिश की, लेकिन एक ही समस्या है:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip 
+1

इसे एक तरफ या अन्य दर्जनों बार पूछा गया है: http://stackoverflow.com/questions/5429790/is-there-a-clean-way-to-avoid-calling-a-method-on- nil-in-a-nested-params-hash – tokland

+1

मूल पोस्टर को नोट करें: जैसा कि आप दावा करते हैं, स्ट्रिंग खाली नहीं है, जो 's =" "' है, यह शून्य है। यह अभी तक मौजूद नहीं है। यदि यह खाली था तो आप इसके साथ जांच सकते हैं: 's.strip जब तक s.empty?' – three

+1

यदि स्ट्रिंग खाली है, तो आपको वह त्रुटि नहीं मिलेगी। – sawa

उत्तर

0

सीधे शब्दों में कहें:

s = s.nil? ? s : s.strip 

Tl, डॉ चेक अगर रों शून्य है, फिर वापस आओ, अन्यथा, इसे पट्टी।

+0

@lukad के बावजूद इसका एक आसान जवाब है। – Eugene

+0

धन्यवाद - बस विभाजन के साथ संयुक्त सरणी के भीतर एक तत्व पर यह कोशिश की। यह अभी भी असफल प्रतीत होता है हालांकि: । डेटा डालता है [2] [1] [6] .nil? ? डेटा [2] [1] [6]: डेटा [2] [1] [6]। एसप्लिट (":") [1] .स्ट्रिप । NoMethodError: शून्य के लिए अपरिभाषित विधि 'स्ट्रिप': NilClass – user1513388

+0

'डेटा [2] [1] [6] .split (": ")' वापसी क्या करता है? ऐसा लगता है कि इसमें केवल एक ही वस्तु है। – lukad

4

मुझे लगता है कि सबसे आसान तरीका निम्न होगा:

s.strip if s 
+2

यदि आप चीजों को चेन करने का प्रयास करते हैं तो वास्तव में सुविधाजनक नहीं है। –

+0

सार्वभौमिक रूप से कहने का एक तरीका है, "यदि मैं शून्य पर एक विधि कहता हूं, तो बस शून्य वापस करें" इसलिए हमें इस सामग्री के साथ हमारे कोड को अव्यवस्थित करने की आवश्यकता नहीं है। IOW, हमें "स्क्रिप्टिंग भाषा" कार्यक्षमता की आवश्यकता है। हो सकता है कि देवता स्तर पर कंसोल में कुछ फेंक दें, अगर आप अनपेक्षित रूप से शून्य प्राप्त करते हैं तो समस्या निवारण में मदद के लिए। – JosephK

+0

@ जोसेफके जेसी सिलाफ के जवाब की जांच करें। जो आप खोज रहे हैं रूबी 2.3 में जोड़ा गया था। इसे _safe नेविगेशन ऑपरेटर_ कहा जाता है। – lukad

1

विधि जो (मुझे पता है, मैं प्राचीन Object अंतरिक्ष अपवित्र कभी नहीं करना चाहिए, लेकिन यह इतना आसान है कि मैं एक जोखिम ले जाएगा) मेरे लिए काम करता है:

class Object 
    def unless_nil(default = nil, &block) 
    nil? ? default : block[self] 
    end 
end 

p "123".unless_nil(&:length) #=> 3 
p nil.unless_nil("-", &:length) #=> "-" 

अपने विशेष मामले में यह हो सकता है:

data[2][1][6].unless_nil { |x| x.split(":")[1].unless_nil(&:strip) }

12

आप ActiveSupport (रेल पुस्तकालय) से विधि try उपयोग कर सकते हैं

gem install activesupport 

require 'active_support/core_ext/object/try' 
s.try(:strip) 

या तुम मेरी मणि tryit जो अतिरिक्त सुविधाएं देता है का उपयोग कर सकते हैं:

gem install tryit 

s.try { strip } 
2

ActiveSupport कि के लिए एक विधि के साथ आता है: try। उदाहरण के लिए, an_object.try :stripnil वापस करेगा यदि an_object शून्य है, लेकिन अन्यथा आगे बढ़ेगा। वाक्यविन्यास send जैसा ही है। सीएफ active_support_core_extensions.html#try

1

आप त्रुटि है कि प्रश्न में प्रकट होता है से बचना चाहते हैं:

s.to_s.strip 
8

आप अतिरिक्त वस्तु कोई आपत्ति नहीं है बनाया जा रहा है, इन काम के दोनों:

"#{s}".strip 
s.to_s.strip 

अतिरिक्त बिना वस्तु:

s && s.strip 
s.strip if s 
47

रूबी 2.3.0 एक सुरक्षित नेविगेशन ऑपरेटर जोड़ा (&.) जो विधि को कॉल करने से पहले शून्य के लिए जांचता है।

s&.strip 

यह वापस आ जाएगी nil अगर snil है, बल्कि NoMethodError को ऊपर उठाने की तुलना में।

+0

हां - रुबी कार्य को कुछ हद तक उचित वेब-स्क्रिप्टिंग भाषा की तरह बनाने का यही एकमात्र तरीका है। अगर केवल उन सभी मामलों के लिए इसे वैश्विक रूप से सेट करने का एक तरीका था जहां यह कष्टप्रद और बेकार व्यवहार प्रकट होता है - और डिफ़ॉल्ट रूप से सभी मानों को तारों में "निहित रूप से रूपांतरित" करने के लिए, जहां आवश्यक हो (जैसे स्टेटमेंट कथन)। – JosephK

+1

पहली बार मैंने यह देखा - सुपर उपयोगी – Yarin