如何从gem扩展类?



我写了一个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!'

最新更新