2015-02-17 7 views
0

я это:Ruby: вызов метода присвойте в другом классе

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

Вы хотите, чтобы иметь возможность переопределить оператор присваивания. Вы не можете сделать это в Ruby – Rado

ответ

0

@amount инициализируется экземпляром Money.

Я предполагаю, что является двойным, как 13.33. Тогда, конечно, то, что вы делаете, принимает @amount и просто устанавливает его на 13.33. Итак, теперь вы перезаписали свой экземпляр Money и заменили его на 13.33.

Ваш value= - это метод сеттера. Это то, что вы используете для установки определенного атрибута объекта вне его реализации. Это API, который позволяет миру получить доступ к стоимости денег. Итак, в Transaction вам нужно использовать этот API, который вы сделали для изменения значения.

Итак, если вы хотите изменить значение своего экземпляра Money, вам нужно будет сделать @amount.value = new_amount.

Edit:

Вы никогда не сможете сделать, чтобы @amount = new_amount и ожидать, что для установки value вашего экземпляра денег. Для этого вам придется переопределить оператор присваивания в Ruby, и это невозможно.

+0

O да, конечно, @amount - это объект! Извините, я слишком устал, может быть. Большое спасибо за вашу помощь и ваши объяснения !!! – Wizix

Смежные вопросы