如何在Ruby / Rails中重新打开模块

时间:2011-05-04 18:24:55

标签: ruby-on-rails ruby

我有一个位于vendor / plugins文件夹中的模块文件。

module Greetings
   def self.greet(message)
      return "good morning" if message=="gm"
      return "evening" if message=="ge"
      return "good afternoon" if message=="ga"
   end
end

当我执行Greetings.greet("ge")时,我将“晚上”作为输出。我想在不改变上述Greetings模块的情况下改变这种行为(显而易见的原因是它是一个外部插件)。

我的问题很简单。当我打电话给Greetings.greet("ge")时,我该怎么办才能回复“非常晚上好”,对于所有其他输入,它应该返回原始模块返回的内容。

我会在config / initializers文件夹中写这个,因为我正在使用Rails。

PS:我已经为课程提出了similar question。但我真的想知道模块是如何工作的。

1 个答案:

答案 0 :(得分:7)

这适用于Ruby 1.8.7和Ruby 1.9.2

module Greetings
   def self.greet(message)
      return "good morning" if message=="gm"
      return "evening" if message=="ge"
      return "good afternoon" if message=="ga"
   end
end

p Greetings.greet("ge") # => "evening"

module Greetings
  class << self
    alias_method :old_greet, :greet

    def greet(message)
      return self.old_greet(message) unless message == "ge"
      return "A Very Good Evening"
    end
  end
end

p Greetings.greet("ge") # => "A Very Good Evening"
p Greetings.greet("gm") # => "good morning"