首页 > 解决方案 > Ruby 绑定上下文

问题描述

我有一个“C”类。我希望 C 运行一个包含块的方法 A。然后,我希望该块具有提供的类的上下文。

C.a do

  b # runs main.b instead of C.b

end

目前,该方法bmain. 我希望它在类的上下文中运行C 如何做到这一点?

class C
  class << self
    def a(&block)
      block.bind self # NOPE!
      block.binding = self # NOPE!
      yield # NOPE!
    end
    def b
    end
  end
end

PS。这与 Rails 路由的模式相同。

标签: rubyscope

解决方案


您需要在类的上下文中评估块:

class C
  class << self
    def a(&block)
      self.instance_eval(&block)
    end
    def b
      puts "hello"
    end
  end
end

C.a do
  b
end

=> "hello"

推荐阅读