क्या निम्नलिखित की तुलना में अधिक मुहावरेदार कुछ है?
foo.class == String
क्या निम्नलिखित की तुलना में अधिक मुहावरेदार कुछ है?
foo.class == String
जवाबों:
मुझे लगता है कि आप ढूंढ रहे हैं 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
String
, बल्कि इसके साथ Integer
और भी Float
। क्या यह भी काम करता है Decimal
? (उदात्त पाठ दुभाषिया वाक्यविन्यास को अलग ढंग से रेखांकित करता है Decimal
जिसके लिए मुझे संदेह होता है)
कहने के लिए एक अधिक बतख-टाइपिंग दृष्टिकोण होगा
foo.respond_to?(:to_str)
to_str
इंगित करता है कि एक वस्तु का वर्ग स्ट्रिंग का वास्तविक वंशज नहीं हो सकता है, लेकिन वस्तु स्वयं बहुत स्ट्रिंग (स्ट्रिंग (?) है)।
foo
या तो हो जाएगा true
, false
या एक वेनिला स्ट्रिंग है, लेकिन यह अच्छी अधिक सामान्य समाधान जानने के लिए।
to_str
, या to_s
? दोनों थोड़े अलग हैं।
तुम कर सकते हो:
foo.instance_of?(String)
और अधिक सामान्य:
foo.kind_of?(String)
kind_of
अधिक सामान्य बनाता है ? वे समानार्थक प्रतीत होते हैं is_a
:।
instance_of?
इसके बजाय था is_a?
।
अन्य उत्तरों के अलावा, क्लास विधि === को यह निर्धारित करने के लिए परिभाषित करता है कि क्या वस्तु उस कक्षा का एक उदाहरण है या नहीं।
मुझे लगता है कि एक बेहतर तरीका कुछ विधेय विधियों का निर्माण करना है। यह आपके "सिंगल पॉइंट ऑफ़ कंट्रोल" को भी बचाएगा।
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
अधिक बतख टाइपिंग तरीका;)
"string".is_a?(String)
। ऐसा लगता है जैसे आप पहिए को फिर से लगा रहे हैं। वहाँ भी है class
, instance_of
, kind_of
, आदि ... बंदर पैच करने के लिए बुरा विचार Object
वर्ग, नहीं यह कहने की जरूरत नहीं है उल्लेख करने के लिए।
pre_check("test".is_string?)
अब आपकी परियोजना की आवश्यकता बदल जाएगी और तीन अक्षर या उससे अधिक वाले प्रत्येक स्ट्रिंग को अब स्ट्रिंग के रूप में परिभाषित नहीं किया जाएगा (मैं इसकी संरचना जानता हूं;)) अब आप अपनी स्वयं की विधि को आसानी से बदल सकते हैं।
is_a?
वास्तव में उपयोग करने के लिए अधिक उपयुक्त मुहावरा है (और अक्सर एंड्रयू ग्रिम उल्लेखों की तरह एक बतख-टाइपिंग चेक भी बेहतर है)। एक सख्त वर्ग तुलना आमतौर पर एक कोड गंध है। en.wikipedia.org/wiki/Liskov_substitution_principle