2010-12-30 13 views
5

最近Rubyに変換しました。次の質問は実際には実用的ではありません。それはRubyの内部構造がどのように機能するかという疑問です。複数の入力を受け入れる標準的な加算演算子をオーバーライドすることは可能ですか?私は、答えがノーであると仮定しています。加算演算子は標準のものですが、私は何か不足していないことを確認したいと思っていました。ruby​​の+演算子をオーバーライドする質問

以下は私の考えを確認するために書いたコードです。注意してください、それは完全に些細な/考案されています。

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

あなたは配列使って似たような達成することができます

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

、後でとしてそれを使用します。

pt1 + [1, 1] 

Chandraのソリューションと組み合わせて、配列とポイントの両方を引数として受け入れることもできます。

+0

ありがとうございました!私はそれがこのようなものになると思った。 – aosik