Ruby块作用域-如何调用实例方法

Ruby块作用域-如何调用实例方法,ruby,scope,block,fssm,Ruby,Scope,Block,Fssm,我在Ruby中遇到了一点问题。我创建了一个类,它使用fssm gem监视目录。当发生变化时,我想通知观察者。我用的是可观测模块 代码: 任何想要创建FSSM_Spike实例的观察者都必须将其自身传递给new。然后将它们添加到观察者列表中。但是,当发生FSSM回调时,方法Notify_Observators是未知的,因为该上下文中的self是FSSM::Path 我尝试向FSSM_Spike添加另一个方法,看看是否可以调用它,但结果相同 如何从块上下文中调用方法?您可以将self的当前值保存在变量

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

代码:

任何想要创建FSSM_Spike实例的观察者都必须将其自身传递给new。然后将它们添加到观察者列表中。但是,当发生FSSM回调时,方法Notify_Observators是未知的,因为该上下文中的self是FSSM::Path

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


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

您可以将
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

如果我正确理解了你想要实现什么,我应该做这个把戏。

哪里定义了
notify\u observators
方法?它是可观察模块的一部分,它就在那里:
这个\u observator.changed这个\u observator.notify\u observators(…)
调用
changed
是通知继续进行所必需的
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
def initialize watcher
  # ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
  this_observer = self
  …
  create do |base, relative|
    puts 'create'  # ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
    notify_observers(this_observer, 'create')
  end
end