gpt4 book ai didi

+= 的 Ruby 方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:11:36 26 4
gpt4 key购买 nike

有没有办法让 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

最佳答案

  1. 您不能在 Ruby 中覆盖复合赋值运算符。任务在内部处理。您应该覆盖 +,而不是 +=plane.a += bplane.a = plane.a + bplane.a=(plane.a.+(b) )。因此,您还应该在 Plane 中覆盖 a=
  2. 当您编写 plane.x += 5 时,+ 消息将发送到 plane.x,而不是 plane。所以你应该覆盖x类中的+方法,而不是Plane
  3. 引用@variable时,要注意当前的self是什么。在 类 Plane 中; @多变的; end@variable 指的是类的实例变量。这与 class Plane 中的不同;定义初始化; @多变的;结尾; end,它是类实例的实例变量。所以你可以把初始化部分放在initialize方法中。
  4. 应谨慎对待运算符覆盖。有时它是富有成效和富有表现力的,但有时却不是。在这里我认为最好为平面定义一个方法(例如 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

关于+= 的 Ruby 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16805933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com