2009-11-10 13 views
61

मैं हमेशा रूबी में परीक्षण स्ट्रिंग समानता के लिए ऐसा करते हैं:रूबी तारों या प्रतीकों के लिए स्ट्रिंग समानता (समानता ऑब्जेक्ट नहीं) का परीक्षण करने का सबसे संक्षिप्त तरीका?

if mystring.eql?(yourstring) 
puts "same" 
else 
puts "different" 
end 

इस परीक्षण वस्तु समानता के बिना यह करने के लिए सही तरीका क्या है है?

मैं अपनी सामग्री के आधार पर स्ट्रिंग का परीक्षण करने का सबसे संक्षिप्त तरीका ढूंढ रहा हूं।

कोष्ठक और प्रश्न चिह्न के साथ, यह थोड़ा सा गुंजाइश लगता है।

उत्तर

10

आपका कोड नमूना आपके विषय, अर्थात् प्रतीकों के हिस्से पर विस्तारित नहीं हुआ था, और इसलिए प्रश्न का हिस्सा अनुत्तरित नहीं हुआ।

आप दो तार, foo और बार, और दोनों

foo.to_s == bar.to_s 

के साथ या तो एक स्ट्रिंग या प्रतीक हो, आप परीक्षण कर सकते हैं कर सकते हैं समानता है, तो यह थोड़ा और अधिक कुशल के साथ ऑपरेंड पर स्ट्रिंग रूपांतरण को छोड़ने के लिए है ज्ञात प्रकार तो अगर foo हमेशा एक स्ट्रिंग

foo == bar.to_s 

है लेकिन दक्षता लाभ लगभग निश्चित रूप से फोन करने वाले की ओर से कोई अतिरिक्त कार्य की मांग के लायक नहीं है।

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

रूबी 2.2 introduced garbage collection of symbols

+6

'foo.intern == bar.intern' बेहतर होगा - एक स्ट्रिंग को इंटर्न करना एक प्रतीक से स्ट्रिंग बनाने से औसत पर अधिक कुशल है। (यदि किसी दिए गए स्ट्रिंग को पहले इंटर्न किया गया है, तो यह सिर्फ प्रतीक देता है।) – Chuck

+0

उत्कृष्ट, इसे जोड़ने के लिए समय निकालने के लिए धन्यवाद। – sheldonh

+4

असल में मुझे नहीं लगता कि स्ट्रिंग से एक प्रतीक बनाने के लिए एक अच्छा विचार है, बस कुछ तुलनाओं पर थोड़ा सा अर्थव्यवस्था बनाने के लिए, क्योंकि यदि स्ट्रिंग मेल नहीं खाती है तो यह प्रतीकों को रिसाव कर देगा। प्रतीकों को कचरा इकट्ठा नहीं किया जाता है और इसलिए यदि आप उन्हें रखने का इरादा नहीं रखते हैं तो इसलिए नहीं बनाया जाना चाहिए, अन्यथा आप सेवा हमले से इनकार करने के लिए वेक्टर बनाते हैं। – Patru

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