ruby - Where is my instance variable in Object? -
why can't see @obj.instance_variables in object when method_missing invoked?
module arena class place def initialize obj @obj = obj method_missing_in_obj @obj.instance_variable_set(:@unit, '10') puts @obj.instance_variables yield @obj end def method_missing_in_obj def @obj.method_missing method, *args, &blk puts @obj.instance_variables super end self end end end arena::place.new(object.new) |obj| puts obj.instance_variable_get(:@unit) puts obj.foo end $> ruby test_me.rb:
=> @unit => 10 => in `method_missing': undefined method `foo' #<object:0x007fd89b1c96e0 @unit="10"> (nomethoderror)
this subtle bug! problem you're calling @obj.instance_variables when define @obj.method_missing. remember, defines method in @obj's singleton class, when utilize @obj within method definition, you're asking @obj's instance variable @obj nil (and nil has no instance variables).
all need remove explicit receiver, since @obj implicitly receiver methods defined in singleton class.
def method_missing_in_obj def @obj.method_missing method, *args, &blk puts instance_variables super end self end ruby object
No comments:
Post a Comment