Ruby绑定上下文

时间:2018-04-26 00:50:46

标签: ruby scope

我有一个班级" C"。我希望C运行一个接收块的方法A.然后我喜欢这个块来提供课程的上下文。

C.a do

  b # runs main.b instead of C.b

end

目前,方法b正在main的上下文中运行。我希望它能在课程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路由的模式相同。

1 个答案:

答案 0 :(得分:2)

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

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"