凌驾+;ruby中的运算符
这里有一个最近的Ruby转换。下面的问题并不实际;这更多的是关于Ruby内部如何工作的问题。是否可以覆盖标准加法运算符以接受多个输入?我假设答案是否定的,因为加法运算符是标准的,但我想确保我没有遗漏什么 下面是我快速编写的代码,以验证我的想法。注意,这完全是琐碎的/做作的凌驾+;ruby中的运算符,ruby,operators,overriding,addition,Ruby,Operators,Overriding,Addition,这里有一个最近的Ruby转换。下面的问题并不实际;这更多的是关于Ruby内部如何工作的问题。是否可以覆盖标准加法运算符以接受多个输入?我假设答案是否定的,因为加法运算符是标准的,但我想确保我没有遗漏什么 下面是我快速编写的代码,以验证我的想法。注意,这完全是琐碎的/做作的 class Point attr_accessor :x, :y def initialize(x,y) @x, @y = x, y end def +(x,y)
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 ')'
您可以这样定义
+
方法,但只能使用普通的方法调用语法调用它:
pt1.+(1,1)
您可以使用阵列实现类似的功能:
def +(args)
x, y = args
@x += x
@y += y
end
然后将其用作:
pt1 + [1, 1]
您还可以将它与Chandra的解决方案结合起来,接受数组和点作为参数。在实现
+
运算符时,不应改变对象。而是返回一个新的点对象:
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>
类点
属性存取器:x,:y
def初始化(x,y)
@x、 @y=x,y
结束
def+(其他)
新点(@x+other.x,@y+other.y)
结束
def至美国
({@x},{@y})
结束
结束
ruby-1.8.7-p302:
>p1=新点(1,2)
=> #
>p2=新点(3,4)
=> #
>p1+p2
=> #
>p3=p1+p2
=> #
>p3
=> #
>p1+=p2
=> #
>p1
=> #
我同意这个实现,因为它最有意义,但这更像是一个缓慢的工作日实验