2010-12-30 10 views
5

हाल ही में रुबी में कनवर्ट किया गया। निम्नलिखित प्रश्न वास्तव में व्यावहारिक नहीं है; यह एक सवाल है कि रूबी के आंतरिक कैसे काम करते हैं। क्या एकाधिक इनपुट स्वीकार करने के लिए मानक अतिरिक्त ऑपरेटर को ओवरराइड करना संभव है? मुझे लगता है कि जवाब नहीं है, यह देखते हुए कि अतिरिक्त ऑपरेटर मानक है, लेकिन मैं यह सुनिश्चित करना चाहता था कि मुझे कुछ याद नहीं आया।ओवरराइडिंग पर सवाल + रूबी में ऑपरेटर

नीचे दिया गया कोड मैंने अपने विचारों को सत्यापित करने के लिए त्वरित रूप से लिखा है। नोट, यह पूरी तरह से मामूली/contrved है।

class Point 
    attr_accessor :x, :y 

    def initialize(x,y) 
     @x, @y = x, y 
    end 


    def +(x,y) 
     @x += x 
     @y += y 
    end 


    def to_s 
     "(#{@x}, #{@y})" 
    end 
end 

pt1 = Point.new(0,0) 
pt1 + (1,1) # syntax error, unexpected ',', expecting ')' 

उत्तर

8

+ ऑपरेटर को लागू करते समय आपको ऑब्जेक्ट को म्यूटेट नहीं करना चाहिए। इसके बजाय एक नया प्वाइंट ऑब्जेक्ट

class Point 
    attr_accessor :x, :y 

    def initialize(x,y) 
     @x, @y = x, y 
    end 


    def +(other) 
     Point.new(@x + other.x, @y + other.y) 
    end 


    def to_s 
     "(#{@x}, #{@y})" 
    end 
end 

ruby-1.8.7-p302 > p1 = Point.new(1,2) 
=> #<Point:0x10031f870 @y=2, @x=1> 
ruby-1.8.7-p302 > p2 = Point.new(3, 4) 
=> #<Point:0x1001bb718 @y=4, @x=3> 
ruby-1.8.7-p302 > p1 + p2 
=> #<Point:0x1001a44c8 @y=6, @x=4> 
ruby-1.8.7-p302 > p3 = p1 + p2 
=> #<Point:0x1001911e8 @y=6, @x=4> 
ruby-1.8.7-p302 > p3 
=> #<Point:0x1001911e8 @y=6, @x=4> 
ruby-1.8.7-p302 > p1 += p2 
=> #<Point:0x1001877b0 @y=6, @x=4> 
ruby-1.8.7-p302 > p1 
=> #<Point:0x1001877b0 @y=6, @x=4> 
+0

मैं उस कार्यान्वयन से सहमत हूं, क्योंकि यह सबसे अधिक समझ में आता है, लेकिन यह धीमा-दिन-काम-प्रयोग-प्रयोग था – aosik

3

आप + विधि इस तरह परिभाषित कर सकते हैं, लेकिन आप केवल सामान्य विधि कॉल सिंटैक्स का उपयोग कॉल करने के लिए सक्षम हो जाएगा:

pt1.+(1,1) 
0

तो आपको कुछ ऐसा हासिल कर सकते हैं का उपयोग कर सरणियों:

pt1 + [1, 1] 
:
def +(args) 
    x, y = args 
    @x += x 
    @y += y 
end 

और बाद में के रूप में उपयोग 0

आप तीर और अंक दोनों को तर्क के रूप में स्वीकार करने के लिए, चंद्र के समाधान के साथ इसे जोड़ सकते हैं।

+0

धन्यवाद! मैंने सोचा कि यह ऐसा कुछ दिखता है। – aosik

संबंधित मुद्दे