如何使用Ruby Observer方法同时更新两个参数?
我正在研究Ruby的,偶然发现了Observer方法。我试图自定义自己的observer方法来帮助我理解它,但它返回了一个错误。以下是我的想法:如何使用Ruby Observer方法同时更新两个参数?,ruby,design-patterns,Ruby,Design Patterns,我正在研究Ruby的,偶然发现了Observer方法。我试图自定义自己的observer方法来帮助我理解它,但它返回了一个错误。以下是我的想法: class YummyTastyDonut def update(changed_order) puts "Kitchen: Yo, change the order to #{changed_order.order}!" puts "Front: Order for #{changed_order.name}!
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=
方法,它的工作原理与预期的一样
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
我需要更改什么才能同时更新
订单
和订单价格
?这是一个非常奇怪的错误,但我找到了可以帮助您的解决方案。您可以使用一个参数并在其中包含两个值
def order=(opts={})
@order = opts[:new_order]
@order_price = opts[:new_price]
notify_observers
end
并调用此函数:
igg.order= {new_order: 'yumyy better donut', new_price: 15 }
赋值
=
意味着接受要赋值的单个参数。(或者在并行赋值的情况下,接受与变量相同数量的元素)
您可以这样做:
def order=(args)
@order = args[0]
@order_price = args[1]
notify_observers
end
然后像这样打电话
igg.order=["yummy butter donut", 15]
或者使用@BartekGladys建议的选项散列
,但至少可以说,这两种解决方案都很糟糕,容易出错,需要了解方法的内部结构才能正确使用它
目前,即使这种方法有效,也会让未来的您或查看代码库的任何人非常困惑,因为您有一个实例变量@order
,因此假设order=(val)
将分配该变量
您最好使用一种名为change\u order
的方法,该方法接受order
和order\u price
,这将消除所有关于发生了什么的混淆
def change_order(new_order, new_price)
@order = new_order
@order_price = new_price
notify_observers
end
然后读它也更有意义
igg = Customer.new("Iggy", "Bacon Donut", 10)
#Currently seems like it is assigning order to an Array maybe?
igg.order=("yummy butter donut", 15)
#New much clearer as to the implementation and purpose of changing an order
igg.change_order("yummy butter donut", 15)
这是有道理的!以前没想过使用哈希。非常感谢。这么简单的解决方案!为什么我没想到呢?谢谢另外,感谢您指出
=
只能接受1个参数。我以前不知道。这些知识将派上用场:)
igg = Customer.new("Iggy", "Bacon Donut", 10)
#Currently seems like it is assigning order to an Array maybe?
igg.order=("yummy butter donut", 15)
#New much clearer as to the implementation and purpose of changing an order
igg.change_order("yummy butter donut", 15)