如何动态调用模块中的方法?
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
编辑: 我的库中有多个模块,我真的需要能够将字符串转换为模块名称。假设我还有一个名为Email的模块。也许Eval是唯一的方式? EDIT2: 重命名方法,以免与内置的send-method冲突。
答案 0 :(得分:4)
我认为唯一的方法是,如果您希望按名称定义模块String
,并且不要使用#eval
:
Object.const_get( 'Notification' ).send( 'send_notification', 'hello', 'there' )
# hellothere
如果您希望在很多情况下使用强烈不推荐的#eval
:
eval( 'Notification' ).send( 'send_notification', 'hello', 'there' )