2015-01-20 3 views
0

Я рассмотрел пример, когда блок передается методу. Когда этот метод вызывается, то, что передается как переменная в блок, является 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 

ли это правило? Когда вы передаете блок в качестве аргумента метода экземпляра, переменная передается в блок всегда «я»?

+1

Да, это то, что вы specifiying с 'observer.call (само)'. Если вы используете 'observer.call ('some_string')', то ваш значение 'changed_employee' будет' some_string'. Вы всегда можете использовать «отладчик» внутри блока и посмотреть, что происходит ... – Fer

+1

... хотя я бы выбрал другой ответ: Нет. Как правило, ваше утверждение НЕ правильно. Однако в вашем примере это утверждение верно. – 7stud

ответ

0

Это правило? Когда вы передаете блок в качестве аргумента метода экземпляра, переменная передается в блок всегда «я»?

No. Аргумент, переданный блоку, - это все, что вы передаете блоку в качестве аргумента.

Вы когда-нибудь использовали массивы в Ruby? Тогда вы бы знали, что Array#each, безусловно, не передать self в блок, а отдельные элементы массива.

Причина self передается в блок здесь, потому что вы передать его:

observer.call(self) 
#    ^^^^ 
Смежные вопросы