2014-01-28 2 views
0

У меня проблемы с блоком в Ruby. Я создал класс, который следит за каталогом с помощью fssm gem. Когда происходит изменение, я хочу уведомить наблюдателей. Я использую модуль Observable.Область блока Ruby - как вызвать метод экземпляра

Код:

require 'fssm' 
require 'observer' 

class FSSM_Spike 
include Observable 

def initialize watcher 
    add_observer watcher 
    FSSM.monitor('./temp/', '**/*', :directories => true) do 
     update do |base, relative| 
      puts 'update' 
      notify_observers(self, 'update') 
     end 
     delete do |base, relative| 
      puts 'delete' 
      notify_observers(self, 'delete') 
     end 
     create do |base, relative| 
      puts 'create' 
      notify_observers(self, 'create') 
     end 
    end 
end 
end 

Любые наблюдатели, которые хотят создать экземпляр FSSM_Spike должен пройти themselve новым. Затем они добавляются в список наблюдателей. Однако, когда происходит обратный вызов FSSM, метод notifiy_observers неизвестен, так как сам в этом контексте является FSSM :: Path.

Я попытался добавить еще один метод к FSSM_Spike, чтобы узнать, могу ли я назвать это, но имел тот же результат.

Как я могу вызвать методы из контекста блока?

+0

Где определяется метод 'notify_observers'? – Agis

+0

Это часть Наблюдаемая модуля – barry

ответ

2
def initialize watcher 
    # ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓ 
    this_observer = self 
    … 
    create do |base, relative| 
    puts 'create' # ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓ 
    notify_observers(this_observer, 'create') 
    end 
end 

должен сделать трюк, если я правильно понял, что вы хотите достичь.

+0

Это примерно там: 'this_observer.changed \t \t \t this_observer.notify_observers (...)' – barry

+0

Параметр 'changed' вызов необходим для уведомления, чтобы продолжить – barry

0

Вы можете сохранить текущее значение self в переменной и передать его позже к блоку:

require 'fssm' 
require 'observer' 

class FSSM_Spike 
include Observable 

def initialize watcher 
    current_object = self # save reference to the current object 

    add_observer watcher 
    FSSM.monitor('./temp/', '**/*', :directories => true) do 
     update do |base, relative| 
      puts 'update' 
      current_object.notify_observers(current_object, 'update') 
     end 
     delete do |base, relative| 
      puts 'delete' 
      current_object.notify_observers(current_object, 'delete') 
     end 
     create do |base, relative| 
      puts 'create' 
      current_object.notify_observers(current_object, 'create') 
     end 
    end 
end 
end 
Смежные вопросы