调用实例方法时 &block 中未定义的局部变量或方法

undefined local variable or method from &block when calling instance method

我遇到 undefined local variable or method 错误。

class MyClass
  def initialize(my_value, &if_undefine_method)
      @my_value = my_value
      @a = if_undefine_method
   end

  def method_missing(m, *args, &block)
     @a.call
  end

  def my_method_to_call_from_block
     'HELLO'
  end
end

a = MyClass.new("some_value") do
     my_method_to_call_from_block
end

当我调用一个缺失的方法时:

a.a_method_that_does_not_exist

调用了 method_missing,但出现错误:

Traceback (most recent call last): 3: from (irb):17 2: from lib/myruby.rb:22:in method_missing' 1: from (irb):16:inblock in irb_binding' NameError (undefined local variable or method `my_method_to_call_from_block' for main:Object)

如何从传递的块中引用实例方法,从而防止错误发生?

该块不是 MyClass 的一部分,它有自己的 self,但没有 my_method_to_call_from_block 方法。从 MyClass 的方法内部使用 @a.call 与在其他地方 调用块没有什么不同 .

如果您希望将 self 设置为您的 MyClass 实例来执行该块,您需要 instance_eval:

def method_missing(m, *args, &block)
   instance_eval &@a
end

考虑区别:

class MyClass
  def initialize(&block)
      @block = block
   end

  def default_self
    @block.call
  end

  def myclass_self
    instance_eval &@block
  end
end


a = MyClass.new do
  p self
end

a.default_self # main

a.myclass_self # <MyClass:0x00007f8da68da348 @block=#<Proc:0x00007f8da68da320@test.rb:16>>