gpt4 book ai didi

ruby-on-rails - 如何从 gem 扩展一个类?

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:47 25 4
gpt4 key购买 nike

我写了一个带有一些我想分享的基本逻辑的 gem。我发布它,安装它,使用它。

我认为还有一些额外的功能是针对我的项目的。我想使用相同的类名添加其他方法,因为它很熟悉,而且我很容易在脑海中跟踪一切。

我怎样才能安装一个 gem,然后在没有冲突的情况下向它添加方法?我过去曾覆盖过在 gems 中定义的方法(尤其是 Devise 方法),但从未因需要扩展类本身而绊倒。

最佳答案

你只是open the class and add methods .如果您知道类的名称以及它在模块层次结构中的位置,那么您只需创建另一个定义相同类的文件并开始添加方法。因为它是相同的类名,所以方法将被添加到另一个类。

这可能与您对 Devise 所做的类似。

因此,如果我在 gem 中有类 Bar,并且它位于名为 Foo 的模块中

# in the gem
module Foo
class Bar
def foobar
'foobar!'
end
end
end

要在这个类中添加一个名为 baz 的方法,而不修改 gem 源代码,然后在您的应用程序中创建一个新文件,再次在其模块中声明该类,然后开始添加内容。

# in some other file in your app
module Foo
class Bar
def baz
'foobar baz!'
end
end
end

> f = Bar.new
> f.foobar
=> 'foobar!'
> f.baz
=> 'foobar baz!'

由于每个模块只能有一个给定名称的类的副本,因此只需再次声明该类即可为现有类添加功能。

如果您想在不更改应用中所有 Bar 对象实例的功能的情况下为一些新类提供 baz 方法,那么扩展 Bar 代替。这将产生这样的效果,即您的新类将具有所有 Bar 功能,加上 新功能,而无需修改 Bar 实例的功能,您可以在您应用的其他地方使用。

class NewClass < Foo::Bar
def baz
'foobar baz!'
end
end

> nc = NewClass.new
> nc.foobar
=> 'foobar!'
> nc.baz
=> 'foobar baz!'

关于ruby-on-rails - 如何从 gem 扩展一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553454/

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