作为参数传递时阻止行为

时间:2015-01-20 08:45:16

标签: ruby-on-rails ruby design-patterns metaprogramming

我已经看过一个将块传递给方法的示例。调用此方法时,作为变量传递到块中的是self。让我用一个例子解释一下:

module Subject 

    def initialize 
        @observers=[] 
    end

    def add_observer(&observer) 
        @observers << observer 
    end 

    def delete_observer(observer) 
        @observers.delete(observer) 
    end 

    def notify_observers 
        @observers.each do |observer| 
            observer.call(self) 
        end
    end 

end

我们将使用add_observer,如下所示:

fred = Employee.new('Fred', 'Crane Operator', 30000)
fred.add_observer do |changed_employee| 
    puts("Cut a new check for #{changed_employee.name}!") 
    puts("His salary is now #{changed_employee.salary}!")
end
这是规则吗?当您将块作为实例方法的参数传递时,传递给块的变量是否始终为“self”?

1 个答案:

答案 0 :(得分:0)

  

这是规则吗?当您将块作为实例方法的参数传递时,传递给块的变量是否始终为“self”?

没有。传递给block的参数是你作为参数传递给块的任何内容。

你曾经在Ruby中使用过数组吗?然后你会知道Array#each肯定self传递给块,而是将数组的各个元素传递给它。

这里将self传递给块的原因是因为你传递了它:

observer.call(self)
#             ^^^^