Я рассмотрел пример, когда блок передается методу. Когда этот метод вызывается, то, что передается как переменная в блок, является 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
ли это правило? Когда вы передаете блок в качестве аргумента метода экземпляра, переменная передается в блок всегда «я»?
Да, это то, что вы specifiying с 'observer.call (само)'. Если вы используете 'observer.call ('some_string')', то ваш значение 'changed_employee' будет' some_string'. Вы всегда можете использовать «отладчик» внутри блока и посмотреть, что происходит ... – Fer
... хотя я бы выбрал другой ответ: Нет. Как правило, ваше утверждение НЕ правильно. Однако в вашем примере это утверждение верно. – 7stud