最近在这里转换成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 ')'

最佳答案

在实现+运算符时,不应改变对象。而是返回一个新的点对象:

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>

关于ruby - 在Ruby中覆盖+运算符的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4565803/

10-10 13:26