दुर्भाग्यवश, यह संभव नहीं है।
यह उन परेशान मामलों में से एक है जहां रूबी ऑब्जेक्ट उन्मुख नहीं है। ओओ में, यह एक ऑब्जेक्ट को अनुकरण करने के लिए संभव हो सकता है (असल में, आप किसके बारे में पूछते हैं, यह ओओ के परिभाषा है - याद रखें कि ओओ सिमुलेशन से बाहर आया है), लेकिन यह संभव नहीं है एक ऑब्जेक्ट बनाएं जो false
अनुकरण करता है।
ऐसा इसलिए है क्योंकि रूबी में, सशर्त नियंत्रण संरचनाएं भाषा में बेक जाती हैं और संदेश में अनुवाद नहीं करती हैं, जबकि अन्य ओओ भाषाओं में वे केवल नियमित संदेश भेजते हैं (या कम से कम संदेश भेजते हैं, जैसे रुबी में for
each
में अनुवाद करता है)। उदाहरण के लिए, स्मालटाक में, Booleans वास्तव में Booleans के चर्च एन्कोडिंग आप लैम्ब्डा पथरी से पता का उपयोग कर लागू किया, और रूबी में अनुवाद किया है कि वे इस जैसे दिखते हैं कर रहे हैं:
:
class FalseClass
def if(&block)
# do nothing
end
def if_then_else(then_lambda, else_lambda)
else_lambda.()
end
def not
true
end
def and(&block)
self
end
def or(&block)
block.()
end
end
और TrueClass
सिर्फ दर्पण छवि है
class TrueClass
def if(&block)
block.()
end
def if_then_else(then_lambda, else_lambda)
then_lambda.()
end
def not
false
end
def and(&block)
block.()
end
def or(&block)
self
end
end
और फिर, जैसे
if 2 < 3 then foo end
if 2 < 3 then bar else baz end
कुछ करने के बजाय आप
होता 0
(2 < 3).if { foo }
(2 < 3).if_then_else(-> { bar }, -> { baz })
# using the new keyword arguments in Ruby 2.0, it almost reads like Smalltalk:
class FalseClass
def if(then: -> {}, else: -> {})
else.()
end
end
class TrueClass
def if(then: -> {}, else: -> {})
then.()
end
end
(2 < 3).if(then: -> { bar }, else: { baz })
इस तरह, आप आसानी से संबंधित ऑब्जेक्ट को कार्यान्वित करके false
को अनुकरण कर सकते हैं।
अन्य मामलों में, जहां कुछ ऑब्जेक्ट वास्तव में बिल्कुल एक विशिष्ट वर्ग का उदाहरण हो और न केवल सही प्रोटोकॉल बोलें, रूबी एक बच निकलने वाला हैच प्रदान करता है। उदाहरण के लिए, यदि कोई विधि वास्तव में को Array
को तर्क के रूप में आवश्यक है, तो पहले यह आपको to_ary
पर कॉल करने का प्रयास करेगा, कम से कम आपको अपने ऑब्जेक्ट को Array
में बदलने का मौका देगा।to_str
, to_int
, to_proc
, to_float
आदि के लिए भी यही है लेकिन कोई समतुल्य to_bool
प्रोटोकॉल नहीं है।
यह स्पष्ट नहीं है: 'Klass.method (मान) क्या है' क्या यह 'ऑब्जेक्ट # विधि' है? यह तर्क के रूप में एक विधि नाम लेता है और एक विधि देता है, जिसे आप बाद में 'कॉल' कर सकते हैं। – user1852994
इसके बजाय विधि, इस मामले में एक "नया" या एक निर्माता –