我写了一个gem,其中包含一些我想要分享的基本逻辑。我发布它,安装它,使用它。
还有一些额外的函数,我认为是针对我的项目的。我想使用相同的类名添加额外的方法,因为它很熟悉,而且对我来说,一切都很容易在心里跟踪。
如何安装gem,然后在其中添加方法而不产生冲突?在过去,我已经覆盖了gems中定义的方法(特别是设计方法),但从未遇到需要扩展类本身的情况。
您只需打开类并添加方法。如果您知道类的名称以及它在模块层次结构中的位置,那么您只需创建另一个定义相同类的文件并开始添加方法。因为它是相同的类名,所以方法将被添加到另一个类中。
这可能与你在设计中所做的类似。
如果我在宝石中有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!'
由于每个模块只能有一个给定名称的类的副本,因此只需再次声明该类即可为现有类添加功能。
如果你想给一些新的类baz
方法而不改变所有Bar
对象实例在你的应用程序中的功能,然后扩展Bar
代替。这将产生的效果是,你的新类将拥有所有的Bar
功能,加上的新功能,而不修改Bar
实例的功能,你可能会在你的应用程序的其他地方使用。
class NewClass < Foo::Bar
def baz
'foobar baz!'
end
end
> nc = NewClass.new
> nc.foobar
=> 'foobar!'
> nc.baz
=> 'foobar baz!'