我这样做:
class Money
attr_reader :value
def initialize(init_amount = 0)
self.value = init_amount
end
def value=(new_amount)
if new_amount >= 0
@value = new_amount
else
puts "ERROR: value can't be less than 0."
end
end
def to_s
("%.2f" % @value).split(".").join(",")
end
end
在另一堂课中,我称呼我的对象:
load 'Money.rb'
class Transaction
attr_reader :amount
def initialize(init_amount)
@amount = Money.new(init_amount)
end
def amount=(new_amount)
@amount = new_amount # Why it doesn't work??
# Why I need to do this ?
# @amount.value=(new_amount)
end
end
为什么@amount = new_amount不会调用Money类的方法值=()?
非常感谢你的帮助!
答案 0 :(得分:0)
@amount
初始化为Money
的实例。
我假设new_amount
是13.33
之类的双倍。然后,当然,您正在做的是@amount
并将其设置为13.33
。所以,现在,您已覆盖Money
的实例并将其替换为13.33
。
您的value=
是一种setter方法。这就是您用来从其实现之外设置Object的特定属性的方法。这是一个让全世界都可以访问的API来改变金钱的价值。因此,在Transaction中,您需要使用此API来更改值。
因此,当然,如果您想更改Money
个实例的价值,则必须执行@amount.value = new_amount
。
编辑:
您永远无法对@amount = new_amount
进行操作,并希望它能够设置Money实例的value
。要实现这一点,你必须在Ruby中覆盖赋值运算符,这是不可能的。