Ruby on rails 如何在Ruby中动态打开方法
我想动态打开一个方法,并根据输入字段返回一个值。我试着用一个例子来问我想要什么。如果我能成功这个例子,我会做我想做的 假设我有一个名为greets的类,它有一个名为greet()的方法,该方法将消息作为参数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
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