यह कहा जाता है जब हम एक वर्ग Point
है और जानता है कि कैसे की तरह निम्नलिखित point * 3
प्रदर्शन करने के लिए है कि:रूबी में, कॉरर्स() वास्तव में कैसे काम करता है?
class Point
def initialize(x,y)
@x, @y = x, y
end
def *(c)
Point.new(@x * c, @y * c)
end
end
point = Point.new(1,2)
p point
p point * 3
आउटपुट:
#<Point:0x336094 @x=1, @y=2>
#<Point:0x335fa4 @x=3, @y=6>
लेकिन फिर,
3 * point
नहीं है समझा:
Point
Fixnum
(TypeError
)
मजबूर नहीं किया जा सकता तो हम आगे एक उदाहरण विधि coerce
परिभाषित करने की जरूरत:
class Point
def coerce(something)
[self, something]
end
end
p 3 * point
आउटपुट:
#<Point:0x3c45a88 @x=3, @y=6>
तो यह है ने कहा कि 3 * point
3.*(point)
जैसा ही है। यही है, उदाहरण विधि *
एक तर्क point
लेता है और ऑब्जेक्ट 3
पर आक्रमण करता है।
अब, के बाद से इस विधि *
एक बिंदु गुणा करने के लिए कैसे पता नहीं है, इसलिए
point.coerce(3)
बुलाया जाएगा, और एक सरणी वापस पाने:
[point, 3]
और फिर *
एक बार है फिर से लागू, क्या यह सच है?
अब, यह समझा जाता है और अब हमारे पास Point
ऑब्जेक्ट है, जैसा कि Point
कक्षा के उदाहरण विधि *
द्वारा किया गया है।
सवाल यह है:
कौन
point.coerce(3)
invokes? क्या यह स्वचालित रूप से रूबी है, या यह*
Fixnum
के अपवाद को पकड़कर कुछ कोड है? या यहcase
कथन है कि जब यह ज्ञात प्रकारों में से एक नहीं जानता है, तोcoerce
पर कॉल करें?क्या
coerce
हमेशा 2 तत्वों की एक सरणी वापस करने की आवश्यकता है? क्या यह कोई सरणी नहीं हो सकती है? या यह 3 तत्वों की सरणी हो सकती है?और यह नियम है कि मूल ऑपरेटर (या विधि)
*
तत्व 1 पर तर्क 1 के साथ तत्व 0 पर लागू किया जाएगा? (तत्व 0 और तत्व 1 उस सरणी में दो तत्व हैंcoerce
द्वारा लौटाए गए हैं।) यह कौन करता है? क्या यह रूबी द्वारा किया जाता है या यहFixnum
में कोड द्वारा किया जाता है? यदि यहFixnum
में कोड द्वारा किया जाता है, तो यह एक "सम्मेलन" है कि हर कोई जबरदस्ती करते समय चलता है?तो यह
Fixnum
की*
में कोड कुछ इस तरह कर रही हो सकता है:class Fixnum def *(something) if (something.is_a? ...) else if ... # other type/class else if ... # other type/class else # it is not a type/class I know array = something.coerce(self) return array[0].*(array[1]) # or just return array[0] * array[1] end end end
तो यह वास्तव में कड़ी मेहनत
Fixnum
के उदाहरण विधिcoerce
में कुछ जोड़ने की है? यह पहले से ही उस में कोड का एक बहुत कुछ है और हम बस इसे बढ़ाने के लिए कुछ लाइनें नहीं जोड़ सकते हैं (लेकिन हम कभी भी करना चाहते हैं?)coerce
Point
कक्षा में काफी सामान्य है और यह*
साथ काम करता है या+
क्योंकि वे संक्रमणीय हैं। क्या होगा अगर यह इस तरह अगर हम परिभाषित प्वाइंट शून्य से Fixnum होने के लिए के रूप में, सकर्मक नहीं है:point = Point.new(100,100) point - 20 #=> (80,80) 20 - point #=> (-80,-80)
यह एक उत्कृष्ट सवाल है! मुझे बहुत खुशी है कि मैंने इसे पाया है क्योंकि यह मुझे परेशान कर रहा है और अभी तक मुझे नहीं लगता था कि यह सुलभ था! – sandstrom
एक अच्छा सवाल है। इसे डालने के लिए धन्यवाद। यह कई इंजीनियर-भ्रम-घंटे बचाएगा, मुझे यकीन है। – VaidAbhishek