调用实例方法时 &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:in
block 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>>
我遇到 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:in
block 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>>