2014-01-28 26 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不知道,因爲該上下文中的self是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 
相關問題