2015-09-01 4 views
0

Я хотел бы иметь возможность динамического прокси-сервера для двух уровней призрачных методов в модуле. Я предполагаю, что на первом уровне необходимо динамически создавать модуль с переменной, которая отслеживает имя моего вызова первого уровня и метод, отсутствующий, чтобы принять мой вызов второго уровня, но я не понимаю, как обратиться это в рабочий код.Metaprogramming multi-level method_missing

module Test 
    def self.method_missing(name, *args) 
     #dynamically create a module and return it 
     #so my 2nd level call hits its method_missing 
    end 
end 

Test::test1::test2 должны позволить мне писать прокси-сервер, который может использовать test1, test2 и *args.

Как я могу реализовать эту идею?

EDIT: Я решил 2-й уровень, но есть ли какая-либо методология, которая могла бы получить неограниченное количество уровней?

+0

Что такое "метод призрак"? –

+0

@CarySwoveland Его метод, полученный методом method_missing. –

ответ

0

Я понял это:

module Test 
    def self.method_missing(name, *args) 
     m = Module.new 
     m.instance_variable_set("@name", name) 
     def m.method_missing(name1, *args) 
      puts @name 
      puts name1 
     end 
     m 
    end 
end 

Test::test1::test2 
#Output: 
# test1 
# test2 
+0

В чем преимущество «Test :: test1 :: test2' over' Test :: test2'? Небольшая вещь (что вы, вероятно, знаете): вы можете опустить второй аргумент 'method_missing' (' * args'), если вы его не используете. –