Ruby:在另一个类中调用assign方法

时间:2015-02-17 07:33:34

标签: ruby oop

我这样做:

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类的方法值=()?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

@amount初始化为Money的实例。

我假设new_amount13.33之类的双倍。然后,当然,您正在做的是@amount并将其设置为13.33。所以,现在,您已覆盖Money的实例并将其替换为13.33

您的value=是一种setter方法。这就是您用来从其实现之外设置Object的特定属性的方法。这是一个让全世界都可以访问的API来改变金钱的价值。因此,在Transaction中,您需要使用此API来更改值。

因此,当然,如果您想更改Money个实例的价值,则必须执行@amount.value = new_amount

编辑:

您永远无法对@amount = new_amount进行操作,并希望它能够设置Money实例的value。要实现这一点,你必须在Ruby中覆盖赋值运算符,这是不可能的。