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


86

मैं हमेशा रूबी में स्ट्रिंग समानता का परीक्षण करने के लिए ऐसा करता हूं:

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

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

मैं उनकी सामग्री के आधार पर तार का परीक्षण करने के लिए सबसे संक्षिप्त तरीके की तलाश कर रहा हूं।

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

जवाबों:



14

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

यदि आपके पास दो तार, फू और बार हैं, और दोनों या तो एक स्ट्रिंग या प्रतीक हो सकते हैं, तो आप समानता का परीक्षण कर सकते हैं

foo.to_s == bar.to_s

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

foo == bar.to_s

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

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

रूबी 2.2 ने प्रतीकों का कचरा संग्रह पेश किया


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

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

जी, मैंने ऐसा नहीं सोचा था। धन्यवाद, मैंने आपकी टिप्पणी के आधार पर अपना उत्तर संशोधित कर दिया है।
sheldonh

1
इसे पुन: स्थापित करने की आवश्यकता है: "अनियंत्रित इनपुट तारों को रोकने से बचें [...] क्योंकि प्रतीक कचरा एकत्र नहीं हैं"। साभार @sheldonh
रात्रि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.