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

时间:2019-06-09 20:51:16

标签: ruby-on-rails ruby ruby-on-rails-5.2

我遇到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被调用,但出现错误:

  

回溯(最近通话最近):           3:来自(irb):17           2:来自lib / myruby.rb:22:在irb_binding'NameError中的method_missing' 1: from (irb):16:in块中(未定义的局部变量或方法`my_method_to_call_from_block'   main:Object)

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

1 个答案:

答案 0 :(得分:2)

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

如果要在将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>>