2010-08-26 3 views
1

Я пытаюсь определить набор функций, где я могу проходить в заданных параметрах.Определение методов «на лету» в Ruby/Rails - как установить параметры?

например, как я могу сделать следующее?

>> get_1_type("xxx") 

V4_RELATIONSHIP_TYPES=[1=>2,3=>4] 

V4_RELATIONSHIP_TYPES.keys.each do |key| 
self.class.send(:define_method, "get_#{key}_type".downcase) do 
    return GuidInfo.get_or_new(PARAMS, V4_RELATIONSHIP_TYPES[key]) 
end 
end 

# i can call -> get_1_type("xxx") , and get the function called 

ответ

6

Попробуйте это:

V4_RELATIONSHIP_TYPES.keys.each do |key| 
self.class.send(:define_method, "get_#{key}_type".downcase) do |param| 
    # use param 
    return GuidInfo.get_or_new(PARAMS, V4_RELATIONSHIP_TYPES[key]) 
end 
end 

Теперь вы можете вызвать метод с параметром:

get_1_type("xxx") 

Edit 1

Некоторые ссылки о Руби блоков:

Start with this one

Link 1

Link 2

+0

спасибо, это здорово! Не возражаете ли вы объяснить, что это на самом деле делает? В частности, я не понимаю, как работает блок. –

+0

Блок используется как тело метода, а параметры блока используются в качестве параметров метода. –

+0

большое спасибо! Все еще получаю голову над блоком, урожай и т. Д. Как вы овладели этим? –

1

Я не уверен, почему вы бы создать метод, способ, вместо того, чтобы просто открыв класс снова и вставив свой метод, но вы могли бы использовать вместо class_eval:

self.class.class_eval %Q{ 
    def get_#{key.downcase}_type(...) 
    ... 
    end 
} 
Смежные вопросы