2014-01-31 5 views
-1

Как я могу динамически вызвать метод в модуле?Динамически вызывать метод в модуле?

module Notification 
    def self.send_notification(title, message) 
    puts title + message 
    end 
end 

def test(string) 
    p string 
end 

if __FILE__ == $0 
    send("test", 'hello from test') 
    send("Notification.send_notification", 'hello', 'there') # Error: undefined method `Notification.send' for main:Object (NoMethodError) 
end 

Edit: У меня есть более чем один модуль в моей библиотеке, и мне действительно нужно, чтобы быть в состоянии преобразовать строку в имени модуля. Скажем, у меня также есть модуль, называемый электронной почтой. Может быть, Эваль - единственный способ? Редактирование2: Переименованный метод, чтобы не противоречить встроенному методу отправки.

ответ

3

Я вижу единственный путь, если вы хотите, чтобы получить модуль по имени определяется как String, и не использовать #eval:

Object.const_get('Notification').send('send_notification', 'hello', 'there') 
# hellothere 

Если вы хотите использовать #eval, сильно не- рекомендуется во многих случаях:

eval('Notification').send('send_notification', 'hello', 'there') 
+0

Только то, что я искал. – hirolau

Смежные вопросы