我遇到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)
如何从传递的块中引用实例方法,以防止发生错误?
答案 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>>