繁体   English   中英

如何在路径中自动包含Gem?

[英]How to automatically include Gem in the path?

我有foo.gem,那里有lib/foo.rb

当我将gem添加到Gemfile时,路径中自动需要foo.rb。 但是我需要自动包含它。 原因是我正在扩展控制台扩展,并且希望它们在我不编写`include Foo'的情况下可用。

我正在尝试

SOME_CLASS.send(:include, Foo)

但是不确定使用哪个类将其添加到路径,例如,当我启动自动包含的控制台时。 这是控制台中自动包含的一些mixin,我需要我的:)谢谢

irb(main):006:0> self.class.included_modules
=> [PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Dependencies::Loadable, Kernel]

聚苯乙烯

我可以用初始值设定项解决问题,但我不想更改项目的代码,我只想添加gem即可。

你试过了吗

Object.send(:include,Foo)

要么

self.send(:include,Foo)

在控制台内

您应该使用Object随附的Kernel模块。 在这里定义了诸如exitputsrequire类的私有方法,因此它是定义命令性API的绝佳选择。

当您扩展Object ,人们期望能够在任何对象上显式调用您的方法,并且他们也理解您的方法取决于该对象的状态。

Kernel方法的理解有所不同。 即使从技术上讲所有对象都可以使用它们,但是您不希望人们编写如下内容:

'some string'.sleep 1000

这是没有道理的。 sleep与弦无关。 它不以任何方式依赖它。 只能使用隐式接收器来调用它,就好像self这个概念根本不存在。

将您的方法设为私有并扩展Kernel可以帮助您传达该信息。


您可以在foo.rb做到这foo.rb

module Foo
  # …
end

Some::Class.send :include, Foo

loadrequire某些文件时,将逐行执行。 您可以将任意代码放在文件中的任何位置,甚至可以放在模块和类定义中。 您可以利用它来正确设置您的库,这样其他人就不必这样做了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM