【问题标题】:require 'rubygems'需要“红宝石”
【发布时间】:2011-02-12 07:08:01
【问题描述】:

我已经看到许多带有这一行的 Ruby 代码示例(例如,http://www.sinatrarb.com/)。这样做的目的是什么?

# require 'rubygems'
require 'sinatra'
get '/hi' do
  "Hello world!"
end

在所有情况下,代码都可以在没有此行的情况下工作。

【问题讨论】:

    标签: ruby rubygems require


    【解决方案1】:

    这通常是多余的。不过,它允许您使用 gem 命令要求特定版本的特定 gem。

    https://guides.rubygems.org/patterns/#requiring-rubygems

    【讨论】:

    • RubyGems 将选择随后安装的最新版本的 gem。如果没有找到此类软件,则会生成异常。
    • 为什么是多余的?这是加载所需 gem 的最佳方式。
    • 其实“require 'rubygems'”并没有加载需要的gem,它只是修改了“require”方法的行为。
    【解决方案2】:

    作为对先前(和正确答案)的补充:Ruby 1.9 和更新版本内置了 RubyGems,因此实际上不需要 require 'rubygems'Source here

    【讨论】:

    • 你是对的,只要 ruby​​ 不是用 --disable-rubygems 构建的。
    【解决方案3】:

    require 'rubygems' 将调整 Ruby loadpath 允许您通过 ruby​​gems 成功获取您安装的 gem,而无需获得 LoadError: no such file to load -- sinatra

    来自 ruby​​gems-1.3.6 文档:

    当需要 RubyGems 时,将 Kernel#require 替换为我们自己的 它能够按需加载宝石。

    当您调用 require 'x' 时,会发生以下情况:

    • 如果文件可以从现有的 Ruby 加载路径加载,它 是。

    • 否则,将在已安装的 gem 中搜索一个文件 火柴。如果在 gem 'y' 中找到它,则该 gem 被激活 (添加到加载路径)。

    如果该文件返回 false 的正常要求功能 已经加载的被保留。

    请参阅Kernel#require 的文档以了解为什么需要这样做。

    【讨论】:

    • 顺便说一句,我不推荐它。请参阅 Ryan Tomayko 的这篇文章:gist.github.com/54177
    • @Carmine Paolino,关于您的评论:Sinatra 是一颗宝石。如果不使用require 'rubygems',确保要求它不会产生错误的最佳方法是什么?
    • 在 Ruby 1.9 中,'require "rubygems"' 会自动发生。在以前的 Ruby 中,rubygems 不是自动需要的,您会收到错误消息。你最好的选择是自动输入,除非你确定你总是在 1.9+ 中运行。 Ruby 不会在意您是否在 1.9+ 中需要它两次,并且您的代码在 1.8.whatever 中会很满意。
    • @yar:我链接的帖子提供了 3 个解决方案。
    • @Greg:引用 Ryan Tomayko:“我用来管理我的 $LOAD_PATH 的系统不是您的库/应用程序/测试问题。是否使用 ruby​​gems 是一个环境问题。您的库或应用程序应该在这件事上没有发言权。明确要求 ruby​​gems 要么没有必要,要么被误导。"
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2012-07-20
    • 2017-04-18
    • 2012-11-15
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2014-06-15
    相关资源
    最近更新 更多