जांचें कि क्या रूबी में एक चर स्ट्रिंग है


124

क्या निम्नलिखित की तुलना में अधिक मुहावरेदार कुछ है?

foo.class == String

जवाबों:


205

मुझे लगता है कि आप ढूंढ रहे हैं instance_of?is_a?और kind_of?व्युत्पन्न वर्गों से उदाहरणों के लिए सही लौटेगा।

class X < String
end

foo = X.new

foo.is_a? String         # true
foo.kind_of? String      # true
foo.instance_of? String  # false
foo.instance_of? X       # true

9
सवाल के इरादे को जाने बिना, मैं सबसे वास्तविक दुनिया की प्रोग्रामिंग स्थितियों के लिए कहूंगा, is_a?वास्तव में उपयोग करने के लिए अधिक उपयुक्त मुहावरा है (और अक्सर एंड्रयू ग्रिम उल्लेखों की तरह एक बतख-टाइपिंग चेक भी बेहतर है)। एक सख्त वर्ग तुलना आमतौर पर एक कोड गंध है। en.wikipedia.org/wiki/Liskov_substitution_principle
mahemoff

एक तरफ त्वरित: यदि आप सशर्त तर्क में इसका उपयोग करते हैं, तो आपको कोष्ठक का उपयोग करने की आवश्यकता है; उदाहरण के लिए, यदि foo.is_a? (स्ट्रिंग) && ...
dan

जैसा कि अपेक्षित था, यह दृष्टिकोण न केवल साथ काम करेगा String, बल्कि इसके साथ Integerऔर भी Float। क्या यह भी काम करता है Decimal? (उदात्त पाठ दुभाषिया वाक्यविन्यास को अलग ढंग से रेखांकित करता है Decimalजिसके लिए मुझे संदेह होता है)
चरण २18

29

कहने के लिए एक अधिक बतख-टाइपिंग दृष्टिकोण होगा

foo.respond_to?(:to_str)

to_str इंगित करता है कि एक वस्तु का वर्ग स्ट्रिंग का वास्तविक वंशज नहीं हो सकता है, लेकिन वस्तु स्वयं बहुत स्ट्रिंग (स्ट्रिंग (?) है)।


ठंडा। इस मामले में मैं जानना चाहता हूँ कि ऐसा fooया तो हो जाएगा true, falseया एक वेनिला स्ट्रिंग है, लेकिन यह अच्छी अधिक सामान्य समाधान जानने के लिए।
davidchambers

यह जाँचने के बाद एक to_s कॉल के साथ गठबंधन करें यदि ऑब्जेक्ट इसका जवाब देता है, और आपने खुद को एक स्ट्रिंग दिया है!
मई

1
@seanmakesgames क्या आपका मतलब है to_str, या to_s? दोनों थोड़े अलग हैं।
एंड्रयू ग्रिम

stackoverflow.com/questions/11182052/… पुन: andrew की टिप्पणी।
seanmakesgames

23

तुम कर सकते हो:

foo.instance_of?(String)

और अधिक सामान्य:

foo.kind_of?(String)

4
क्या kind_ofअधिक सामान्य बनाता है ? वे समानार्थक प्रतीत होते हैं is_a:।
davidchambers

2
@Davidchambers आप सही कह रहे हैं, 'kind_of?' 'is_a?' का पर्यायवाची है।
स्टेन्सलैग

@davidchambers: आप सही हैं, मेरा मतलब instance_of?इसके बजाय था is_a?
फेडरिको ब्यूल्स

7
foo.instance_of? String

या

foo.kind_of? String 

यदि आप केवल इसकी देखभाल करते हैं कि Stringकहीं यह इसकी वंशानुक्रम श्रृंखला से तो नहीं निकला है


4

अन्य उत्तरों के अलावा, क्लास विधि === को यह निर्धारित करने के लिए परिभाषित करता है कि क्या वस्तु उस कक्षा का एक उदाहरण है या नहीं।

  • o.class class of o।
  • o.instance_of? c यह निर्धारित करता है कि o.class == c
  • o.is_a? c क्या ओ का कोई उदाहरण है या इसका कोई उपवर्ग है?
  • o.kind_of? ग * is_a के लिए पर्याय? *
  • वर्ग या मॉड्यूल के लिए c === o , यह निर्धारित करें कि क्या * o.is_a? सी * ( स्ट्रिंग === " रिटर्न सही है)

-1

मुझे लगता है कि एक बेहतर तरीका कुछ विधेय विधियों का निर्माण करना है। यह आपके "सिंगल पॉइंट ऑफ़ कंट्रोल" को भी बचाएगा।

class Object
 def is_string?
   false
 end
end

class String
 def is_string?
   true
 end
end

print "test".is_string? #=> true
print 1.is_string?      #=> false

अधिक बतख टाइपिंग तरीका;)


2
क्या बुराई है "string".is_a?(String)। ऐसा लगता है जैसे आप पहिए को फिर से लगा रहे हैं। वहाँ भी है class, instance_of, kind_of, आदि ... बंदर पैच करने के लिए बुरा विचार Objectवर्ग, नहीं यह कहने की जरूरत नहीं है उल्लेख करने के लिए।
मोहम्मद

मैं आपसे पूरी तरह सहमत हूं :) यदि आपका ध्यान केवल प्राइमिटवे प्रकारों पर है और आप जानते हैं कि आदिम प्रकारों से संबंधित आपकी परियोजना की आवश्यकताएं कभी नहीं बदलेंगी (ठीक है आमतौर पर मामला;)) ठीक है। लेकिन ऐसे मामले में जहां आवश्यकताओं को "सिंगल पॉइंट ऑफ कंट्रोल" होना बेहतर होता है। अपने प्रोजेक्ट वातावरण में उदाहरण के लिए आपके पास बहुत से पूर्व चेक (1000 और ऊपर) हैं। pre_check("test".is_string?) अब आपकी परियोजना की आवश्यकता बदल जाएगी और तीन अक्षर या उससे अधिक वाले प्रत्येक स्ट्रिंग को अब स्ट्रिंग के रूप में परिभाषित नहीं किया जाएगा (मैं इसकी संरचना जानता हूं;)) अब आप अपनी स्वयं की विधि को आसानी से बदल सकते हैं।
schlegel11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.