Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby Observer方法同时更新两个参数?_Ruby_Design Patterns - Fatal编程技术网

如何使用Ruby 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}!

我正在研究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}!"
        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)