Ruby on rails 如何在Ruby中动态打开方法

Ruby on rails 如何在Ruby中动态打开方法,ruby-on-rails,ruby,dynamic,methods,Ruby On Rails,Ruby,Dynamic,Methods,我想动态打开一个方法,并根据输入字段返回一个值。我试着用一个例子来问我想要什么。如果我能成功这个例子,我会做我想做的 假设我有一个名为greets的类,它有一个名为greet()的方法,该方法将消息作为参数 class Greetings def self.greet(message) return "good morning" if message=="gm" return "evening" if message=="ge" return "good

我想动态打开一个方法,并根据输入字段返回一个值。我试着用一个例子来问我想要什么。如果我能成功这个例子,我会做我想做的

假设我有一个名为greets的类,它有一个名为greet()的方法,该方法将消息作为参数

class Greetings
   def self.greet(message)
      return "good morning" if message=="gm"
      return "evening" if message=="ge"
      return "good afternoon" if message=="ga"
   end
end
当我做一个
问候语.greet(“ge”)
时,我得到的输出是“晚上”。我希望在不更改上述问候语类的情况下更改此行为(明显的原因是它是一个外部库)

我的问题很简单。当我说我呼叫问候语时应该怎么做。问候语(“ge”)应该返回我“晚上好”,对于所有其他输入,它应该返回原始类返回的内容。我知道一些关于在Ruby中动态打开类的知识,但是对于其他情况,我如何将该方法委托给父级呢

因为我使用的是Rails,所以我将把它写在config/initializers文件夹中。

方法别名 例如,您可以将旧方法别名为
old\u greet
,并使用自己的方法重新定义:

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

    def greet(message)
      (message == "ge") ? "A Very Good Evening" : old_greet(message)
    end
  end
end
方法链 使用Rails功能:

扩展类 您可以创建自己的类来扩展原始类,如下所示:

module My
  class Greetings < ::Greetings
    def self.greet(message)
      case message
        when "ge"
          "A Very Good Evening"
        else
          super(message)
      end
    end
  end
end

您可以执行以下操作以在代码中重新打开该类:

Greetings.class_eval do
  class << self
    alias :old_greet :greet
  end
  def self.greet(message)
    return "a very good evening" if message == "ge"
    old_greet(message)
  end
end
问候语.class\u eval do

课堂简单地说,这个怎么样

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

class GreetingsOverloaded < Greetings
  def self.greet(message)
      return "A Very Good Evenin" if message=="ge"
      super
   end
end

puts Greetings.greet("ge")
puts GreetingsOverloaded.greet("ge")
课堂问候语
def自我问候(信息)
如果消息==“gm”,则返回“早上好”
如果消息==“ge”,则返回“晚间”
如果消息==“ga”,则返回“午安”
结束
结束
班级问候语满负荷<问候语
def自我问候(信息)
如果消息==“ge”,则返回“非常好的夜晚”
超级的
结束
结束
打招呼。问候(“ge”)
将问候语加载。问候语(“ge”)

您可以执行以下操作

class Greetings
  class << self
    alias :old_greet :greet
  end

  def self.greet(message)
    return "A very good evening" if message == 'ge'
    old_greet(message)
  end
end
课堂问候语

你能重新开课吗?是否需要类评估?有趣的是,我们基本上发布了相同的解决方案,只是您使用了类评估,我直接重新打开了类。:-)重新打开该类后,如果该类尚不存在,它将创建该类。对于类_eval,如果该类不存在,将抛出一个错误。感谢您让我了解类_evalThanks István,我只是在这里直接编写了代码,显然将类名与方法名混淆了。:-)谢谢你这么好的书面回答!!
puts My::Greetings.greet("ge")
Greetings.class_eval do
  class << self
    alias :old_greet :greet
  end
  def self.greet(message)
    return "a very good evening" if message == "ge"
    old_greet(message)
  end
end
class Greetings
   def self.greet(message)
      return "good morning" if message=="gm"
      return "evening" if message=="ge"
      return "good afternoon" if message=="ga"
   end
end

class GreetingsOverloaded < Greetings
  def self.greet(message)
      return "A Very Good Evenin" if message=="ge"
      super
   end
end

puts Greetings.greet("ge")
puts GreetingsOverloaded.greet("ge")
class Greetings
  class << self
    alias :old_greet :greet
  end

  def self.greet(message)
    return "A very good evening" if message == 'ge'
    old_greet(message)
  end
end