Немного поздно, но 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]
Не уверен, почему метод для вас ноль ...
РЕДАКТИРОВАТЬ:
По звукам, которые вы хотите выполнить:
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"