动态调用模块中的方法?

时间:2014-01-31 13:38:23

标签: ruby methods module

如何动态调用模块中的方法?

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冲突。

1 个答案:

答案 0 :(得分:4)

我认为唯一的方法是,如果您希望按名称定义模块String,并且不要使用#eval

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

如果您希望在很多情况下使用强烈不推荐的#eval

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