加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在路径中自动包含Gem?

发布时间:2020-12-17 07:10:19 所属栏目:百科 来源:网络整理
导读:我有foo.gem,那里有lib / foo.rb. 当我向Gemfile添加gem时,我的路径中自动需要foo.rb.但我需要自动包含它.原因是我正在进行控制台扩展,我希望它们在没有我写“include Foo”的情况下可用. 我正在试验 SOME_CLASS.send(:include,Foo) 但不确定使用哪个类将其
我有foo.gem,那里有lib / foo.rb.

当我向Gemfile添加gem时,我的路径中自动需要foo.rb.但我需要自动包含它.原因是我正在进行控制台扩展,我希望它们在没有我写“include Foo”的情况下可用.

我正在试验

SOME_CLASS.send(:include,Foo)

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

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

附:

我可以解决初始化程序的问题,但我不想更改项目的代码我只想添加gem并且它可以工作.

解决方法

您应该使用 Kernel模块,它包含在 Object中.这是定义exit,puts和require等私有方法的地方,因此它是定义命令式API的绝佳选择.

当你扩展Object时,人们希望能够在任何对象上显式调用你的方法,并且他们也知道你的方法取决于该对象的状态.

内核方法理解不同.尽管它们在技术上可用于所有对象,但您不希望人们编写如下内容:

'some string'.sleep 1000

这毫无意义. sleep与字符串无关;它不以任何方式依赖它.它应该只用一个隐式接收器来调用,就好像自我的概念不存在一样.

将您的方法设为私有并扩展内核可以帮助您获取该消息.

你可以在foo.rb中做到这一点:

module Foo
  # …
end

Some::Class.send :include,Foo

当您加载或需要一些文件时,它会逐行执行.您可以将任意代码放在文件中的任何位置,甚至可以放在模块和类定义中.您可以利用它来正确设置您的库,以便其他人不必这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读