Я изучаю Ruby's Design Pattern и наткнулся на метод Observer. Я попытался настроить собственный метод наблюдателя, чтобы помочь мне понять его, но он возвращает ошибку. Вот что я придумал:Как обновить два аргумента одновременно с использованием метода Ruby Observer?
class YummyTastyDonut
def update(changed_order)
puts "Kitchen: Yo, change the order to #{changed_order.order}!"
puts "Front: Order for #{changed_order.name}!"
puts "Front: The price will now be #{changed_order.order_price} "
end
end
class Customer
attr_reader :name, :order
attr_accessor :order_price
def initialize(name, order, order_price)
@name = name
@order = order
@order_price = order_price
@observers = []
end
def order=(new_order, new_price)
@order = new_order
@order_price = new_price
notify_observers
end
def notify_observers
@observers.each do |observer|
observer.update(self)
end
end
def add_observer(observer)
@observers << observer
end
def delete_observer(observer)
@observers.delete(observer)
end
end
Если вы читали книгу, я изменил имена классов, но суть та же. Одна вещь, которую я изменил, - это метод order=
; теперь он принимает два аргумента вместо одного.
Целью является то, что после создания нового Customer
, я хочу, чтобы новый клиент имел возможность изменить мой заказ и уведомить YummyTastyDonut
. Тем не менее, я хочу обновить две вещи: order
и order_price
(очевидно, если я изменю свой заказ, цена также изменится). Я хочу YummyTastyDonut
ответить на мои изменения.
igg = Customer.new("Iggy", "Bacon Donut", 10)
=> #<Customer:0x0056212e48a940 @name="Iggy", @order="Bacon Donut", @order_price=10, @observers=[]>
donut = YummyTastyDonut.new
=> #<YummyTastyDonut:0x0056212e4894c8>
## Updating my order and order_price ##
igg.order = ("yummy butter donut", 15)
#(repl):1: syntax error, unexpected ',', expecting ')'
#igg.order = ("yummy butter donut", 15)
Если я использую этот order=
метод, который принимает только один аргумент, он работает так же, как ожидалось.
def order=(new_order)
@order = new_order
notify_observers
end
igg.order = "Triple bacon donut explosion"
Kitchen: Yo, change the order to Triple bacon donut explosion!
Front: Order for Iggy!
Front: The price will now be 10
Что я должен изменить, так что я могу обновить и order
и order_price
одновременно?
Такое простое решение! Почему я не подумал об этом? Благодаря!!Кроме того, спасибо, указав, что '=' может принимать только 1 arg. Раньше я этого не знал. Это знание пригодится :) – Iggy