0

我在 Ruby 中遇到了一些问题。我创建了一个使用 fssm gem 监视目录的类。当发生变化时,我想通知观察者。我正在使用 Observable 模块。

代码:

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 实例的观察者都必须将它们自己传递给新的。然后将这些添加到列表观察者中。但是,当 FSSM 回调发生时,notifiy_observers 方法是未知的,因为该上下文中的 self 是 FSSM::Path。

我尝试向 FSSM_Spike 添加另一种方法,看看是否可以调用它,但结果相同。

如何从块上下文中调用方法?

4

2 回答 2

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

如果我正确理解您想要实现的目标,应该可以解决问题。

于 2014-01-28T14:02:24.140 回答
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
于 2014-01-28T13:39:44.367 回答