gpt4 book ai didi

ruby-on-rails - 如何在 Ruby 中动态打开一个方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:14:59 26 4
gpt4 key购买 nike

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

假设我有一个名为 Greetings 的类,它有一个名为 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

当我执行 Greetings.greet("ge") 时,我得到“evening”作为输出。我想在不更改上述 Greetings 类的情况下更改此行为(显而易见的原因是它是一个外部库)。

我的问题很简单。当说我调用 Greetings.greet("ge") 应该返回“A Very Good Evening”并且对于所有其他输入,它应该返回原始类返回的内容时我应该怎么做。我知道一些关于在 Ruby 中动态打开类的知识,但在其他情况下我如何将方法委托(delegate)给父类?

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

最佳答案

方法别名

例如,您可以将旧方法别名为 old_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

然后你可以:

puts Greetings.greet("ge")

方法链

使用 Rails alias_method_chain特点:

class Greetings
class << self
def greet_with_modifications(message)
(message == "ge") ? "A Very Good Evening" : greet_without_modifications(message)
end

alias_method_chain :greet, :modifications
end
end

然后你可以:

puts Greetings.greet("ge")

扩展类

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

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

然后你可以:

puts My::Greetings.greet("ge")

关于ruby-on-rails - 如何在 Ruby 中动态打开一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com