如何在加载gem后覆盖方法/属性?

时间:2016-02-14 20:54:01

标签: ruby rubygems

我正在开发一个覆盖Pry.config.print方法的gem。这是执行此操作的代码:

if !!defined?(::Pry)
  puts 'Working with Pry'

  Pry.config.print = proc do |output, value|
    if value.class.included_modules.include?(::Organizer::Explainer)
      output.puts "#{value.inspect}"
    else
      ::Pry::DEFAULT_PRINT.call(output, value, _pry_)
    end
  end

else
  puts 'Not working with Pry'
end

我将我的gem包含在rails项目中,在执行rails c后,我可以看到消息:"不使用Pry" 。 然后,我将以前的代码复制/粘贴到控制台中,我可以看到消息:"使用Pry" ,一切正常。

所以,问题是我需要在加载pry后执行de代码。我该怎么做?

1 个答案:

答案 0 :(得分:0)

Rails在开发过程中懒得运行,所以在Pry会话期间尝试使用rails console之前,它就不会被加载。这听起来像是第一次运行代码时,没有任何内容访问过Pry,但第二次出现了问题。

为了确保在您尝试使用或monkeypatch之前加载库,特别是如果您正在开发可以在Rails之外使用的gem,其中加载必须更明确,只需要它。所以在这种情况下,

require 'pry'

您可以使用干净的IRB会话来说明这一点:

$ irb
2.3.0 :001 > defined?(Pry)
 => nil
2.3.0 :002 > require 'pry'
 => true
2.3.0 :003 > defined?(Pry)
 => "constant"