11

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 ')'
4

3 に答える 3

14

+オペレーターを実装するときは、オブジェクトを変更しないでください。代わりに、新しいポイント オブジェクトを返します。

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> 
> p2 = Point.new(3, 4)
=> #<Point:0x1001bb718 @y=4, @x=3> 
> p1 + p2
=> #<Point:0x1001a44c8 @y=6, @x=4> 
> p3 = p1 + p2
=> #<Point:0x1001911e8 @y=6, @x=4> 
> p3
=> #<Point:0x1001911e8 @y=6, @x=4> 
> p1 += p2
=> #<Point:0x1001877b0 @y=6, @x=4> 
> p1
=> #<Point:0x1001877b0 @y=6, @x=4> 
于 2010-12-30T20:18:03.550 に答える
5

そのようにメソッドを定義できますが、+通常のメソッド呼び出し構文を使用してのみ呼び出すことができます。

pt1.+(1,1)
于 2010-12-30T20:02:12.023 に答える
1

配列を使用して同様のことを実現できます。

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

後で次のように使用します。

pt1 + [1, 1]

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

于 2010-12-30T20:17:29.680 に答える