有点晚了,但是instance_variable_missing 和method_missing 在一定程度上是一样的...上下面的课:
class Test
def method_missing(*args)
puts args.inspect
end
end
t = Test.new
现在让我们获取一些实例变量:
t.pineapples #=> [:pineapples]
t.pineapples = 5 #=> [:pineapples=,5]
不知道为什么这个方法对你来说是 nil...
编辑:
根据你想要完成的声音:
t = SomeClass.new
t.property.child = 1
让我们尝试从前面的示例中返回一个Test 对象:
class Test
def method_missing(*args)
puts args.inspect
return Test.new
end
end
那么当我们调用时会发生什么:
t = Test.new
t.property.child = 1
#=>[:property]
#=>[:child=,1]
所以这表明这确实是可能的。 OpenStruct 使用相同的技术动态设置实例变量。在下面的示例中,我创建了 EternalStruct,它完全符合您的要求:
require 'ostruct'
class EternalStruct < OpenStruct
def method_missing(*args)
ret = super(*args)
if !ret
newES = EternalStruct.new
self.__send__((args[0].to_s + "=").to_sym, newES)
return newES
end
end
end
EternalStruct的用法:
t = EternalStruct.new
t.foo.bar.baz = "Store me!"
t.foo.bar.baz #=> "Store me!"
t.foo #=> #<EternalStruct bar=#<EternalStruct baz="Store me!">>
t.a = 1
t.a #=> 1
t.b #=> #<EternalStruct:...>
t.b = {}
t.b #=> {}
def t.c(arg)
puts arg
end
t.c("hi there") #=> "hi there"