2010-12-30 7 views
5

Una conversión reciente a Ruby aquí. La siguiente pregunta no es realmente práctica; es más una pregunta sobre cómo funciona el funcionamiento interno de Ruby. ¿Es posible anular el operador de suma estándar para aceptar múltiples entradas? Supongo que la respuesta es no, dado que el operador de suma es estándar, pero quería asegurarme de que no me faltaba algo.pregunta sobre anulación + operador en ruby ​​

A continuación se muestra el código que escribí rápidamente para verificar mis pensamientos. Tenga en cuenta que es completamente trivial/artificial.

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

Respuesta

8

No debe mutar objeto al implementar el operador +. En su lugar, devuelva un nuevo Objeto de punto

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

estoy de acuerdo con esa implementación, ya que tiene más sentido, pero esto fue más de un experimento de día lento de trabajo – aosik

3

puede definir el método + así, pero sólo será capaz de llamar usando la sintaxis normal de llamada al método:

pt1.+(1,1) 
0

Se puede lograr algo similar utilizando conjuntos:

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

y luego utilizarlo como:

pt1 + [1, 1] 

También puede combinarlo con la solución de Chandra, para aceptar arrays y puntos como argumentos.

+0

gracias! pensé que se vería algo como esto. – aosik