【问题标题】:Which libraries are loaded by default in pry?pry 中默认加载哪些库?
【发布时间】:2018-08-07 14:36:58
【问题描述】:

当我在pry 中使用Tempfile 类时,我不使用require。

% pry -f
pry(main)> Tempfile
Tempfile < #<Class:0x00007fb5121149b8>

但是在irb 中我必须先要求tempfile。

% irb
irb(main):001:0> Tempfile
NameError: uninitialized constant Tempfile
    from (irb):1
    from /Users/ironsand/.rbenv/versions/2.4.3/bin/irb:11:in `<main>'
irb(main):002:0> require 'tempfile'
=> true

看来pry 默认会加载一些库。 实际加载了哪些库?

这是我的环境

 % ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin17]
 % irb --version
pirb 0.9.6(09/06/30)
 % pry --version
Pry version 0.11.3 on Ruby 2.4.3

【问题讨论】:

    标签: ruby irb pry


    【解决方案1】:

    您可以比较 $LOADED_FEATURES 以查看默认 pry 会话与 irb 会话(或纯 ruby​​ 脚本)中加载的所有内容。

    简短的回答是,Pry 会加载它需要提供自己的行为的任何库。冗长的答案太长(而且很可能过时或版本之间存在差异),无法在此处列出 - 最好询问您当前的环境。

    最好不要依赖其他库为您加载它们的依赖项,因为这些依赖项可能会发生变化。 (尽管在这种情况下,很难注意到您缺少require,因为一切仍然有效。)

    【讨论】:

    • 补充一点,最新版本的pry(在撰写本文时)也依赖于coderay 和method_source gems。所以加载的库的完整列表也取决于当前版本的 那些 gems 碰巧使用。所有这些也可能依赖于当前的 ruby​​ 版本和 ruby​​ 解释器。
    • 所以我的总结是(1)谁在乎什么是自动加载的?始终假设默认情况下没有加载任何内容,你会没事的。 require多次使用同一个依赖不是问题;事实上,第二次它会什么都不做。如果您真的想强制重新需要依赖项,请使用load。 (2) 如果您真的很在意,最好只查看$LOADED_FEATURES 而不是查看一些 StackOverflow 帖子/类似内容,因为这些信息几乎肯定会过时。
    • @TomLord 我假设 (1) 的答案是相反的:“我很高兴使用 Tempfile 没有意识到它是必需的;我还需要同样谨慎吗?”;不幸的是,我认为没有很好的解决方案(不包括“只记得”和“查找您使用的每个看似内置的常量”)。
    • 底线,如果它不是 core 库的一部分,您应该要求它包括 standard 库脚本。依赖第三方脚本/gem 的任何其他“自动”行为,这些行为可能会在您无法控制的任何时刻发生变化,这并不是编写健壮代码的最佳方式。如果一切都需要自己的依赖而不依赖他人,那么就没有什么好担心的了。
    【解决方案2】:

    作为 $LOADED_FEATURES 的替代方案(可能有点过分),请考虑:

    Gem.loaded_specs.values.each {|s| puts s.name}
    

    仅列出带有规格的宝石

    [20] pry(main)> Gem.loaded_specs.values.each {|s| puts s.name};nil
    did_you_mean
    coderay
    method_source
    pry
    io-console
    vls
    => nil
    

    顺便说一句,在这个例子中,我手动加载了 vls gem。

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2015-04-02
      相关资源
      最近更新 更多