有没有办法让Ruby能够做到这样的事情?
class Plane
@moved = 0
@x = 0
def x+=(v) # this is error
@x += v
@moved += 1
end
def to_s
"moved #{@moved} times, current x is #{@x}"
end
end
plane = Plane.new
plane.x += 5
plane.x += 10
puts plane.to_s # moved 2 times, current x is 15
答案 0 :(得分:6)
+=
,而不是+
。 plane.a += b
与plane.a = plane.a + b
或plane.a=(plane.a.+(b))
相同。因此,您还应该覆盖a=
。{/ li>中的Plane
plane.x += 5
时,+
消息将发送至plane.x
,而非plane
。因此,您应该在+
类中覆盖x
方法,而不是Plane
。@variable
时,您应该注意当前的self
是什么。在class Plane; @variable; end
中,@variable
指的是类的实例变量。这与class Plane; def initialize; @variable; end; end
中的那个不同,后者是类的实例的实例变量。因此,您可以将初始化部分放入initialize
方法。fly
)而不是使用某个运算符。class Plane
def initialize
@x = 0
@moved = 0
end
def fly(v)
@x += v
@moved += 1
end
def to_s
"moved #{@moved} times, current x is #{@x}"
end
end
plane = Plane.new
plane.fly(5)
plane.fly(10)
puts plane.to_s
答案 1 :(得分:5)
+=
运算符与任何方法都没有关联,它只是语法糖,当你编写a += b
Ruby解释器将其转换为a = a + b
时,同样适用于{{1}转换为a.b += c
。因此,您只需根据需要定义方法a.b = a.b + c
和x=
:
x