【问题标题】:What does $:<< "." do to Ruby's require path?$:<< "." 是什么意思?对 Ruby 的 require 路径做些什么?
【发布时间】:2012-01-28 00:14:41
【问题描述】:

我不明白 Ruby 中$:&lt;&lt; "." 的含义。

我将 Ruby 升级到 1.9.1,但程序无法运行。同学告诉我应该加$:&lt;&lt; "."

$:&lt;&lt; "." 是做什么的?

【问题讨论】:

  • 了解为什么 Ruby 不再在搜索路径中包含“.”很重要。如果有人能够将具有所需文件名的文件放入您的“.”目录中,则可能会对应用程序进行利用。 1.9 之前的行为将加载该文件,覆盖所需文件的行为,并以应用程序所有者的权限运行。那可能是灾难性的。默认的require 行为已更改,但添加了require_relative 以允许您从与脚本相关的目录中加载。我从不使用$:&lt;&lt; '.',而是明确列出路径。
  • 请注意,如果该行的目标是允许您自己 require 与当前脚本位于同一目录中的文件,那不是您想要的完全:它除非脚本位于当前工作目录中,否则将无法正常运行。要将脚本的目录添加到加载路径,请使用$:.unshift File.dirname(__FILE__)(我使用unshift 将目录添加到列表中,以便它优先于可能存在的任何其他加载路径。)

标签: ruby require


【解决方案1】:

从 1.9 版开始,Ruby 不再在当前工作目录 AKA . 中查找所需文件。 $LOAD_PATH$: 全局变量是一个路径数组,Ruby 在其中查找 require 的文件。

通过将$:&lt;&lt; "." 添加到您的文件中,您实际上是在告诉Ruby 将您的当前目录包含在搜索路径中。这会覆盖新的 Ruby 行为。

【讨论】:

    【解决方案2】:

    在您的示例中,您将工作目录 (".") 添加到 ruby​​ 加载路径 ($:)。

    工作目录 (".") 在 Ruby 1.9 中已从加载路径(全局变量 $:$-I$LOAD_PATH)中删除,因为它被认为存在安全风险:

    • 您的工作目录可以是任何文件夹,如果这些文件具有适当的名称,您的脚本将需要该文件夹中的文件。例如,您在 Project1 文件夹 main.rb 和 init.rb 中有 2 个文件:

    ==Project1/main1.rb:
    $: ==Project1/init.rb:
    放'init 1'

    你有一个相似的项目:

    ==Project2/main2.rb:
    $: ==Project2/init.rb:
    放'init 2'

    如果您从 Project2 文件夹运行 Project1,则 main1.rb 将需要 Project2/init.rb,而不是 Project1/init.rb:

    ~/Projects/Project2$ ruby​​ ../Project1/main1.rb
    init 2 # 可能是意想不到的危险
    ~/Projects/Project2$ ruby​​ main2.rb
    初始化 2

    • 您可以在代码中更改工作目录,例如使用Dir.chdir:

      ruby-1.9.2-p290 :002 > puts File.expand_path('.')
      => /home/alex/Projects
      ruby-1.9.2-p290 :003 > Dir.chdir('..') 
      ruby-1.9.2-p290 :004 > puts File.expand_path('.')
      => /home/alex
      

    我建议您使用以下技术代替$: &lt;&lt; '.'

    • require_relative仅限 Ruby 1.9

    • 将文件的文件夹添加到工作目录(常用方法,因为它与 Ruby 1.8 兼容):$: &lt;&lt; File.expand_path('..', __FILE__) etc.__FILE__ 是对当前文件名的引用。 File.expand_path 将路径名转换为绝对路径名。

    【讨论】:

      【解决方案3】:
      1. $: 是保存组成 Ruby 加载路径的路径数组的变量
      2. &lt;&lt; 将一个项目附加到数组的末尾
      3. .指的是当前目录

        1   2  3
        |   |  |
        V   V  V
        $: << "."
        

      所以你正在将当前目录添加到 Ruby 的加载路径

      参考资料:

      1. 可以在The Pragmatic Programmers Guide本页的Execution Environment Variables部分找到

        字符串数组,其中每个字符串指定一个目录,用于搜索 Ruby 脚本和 load 和 require 方法使用的二进制扩展。初始值是通过 -I 命令行选项传递的参数的值,后跟安装定义的标准库位置,然后是当前目录(“.”)[显然此链接适用于旧版本的 Ruby因为它仍然在那里]。可以在程序中设置此变量以更改默认搜索路径;通常,程序使用 $:

      2. 可以在 ruby​​-doc.org 的 docs for array 中找到。

        Append - 将给定对象推到此数组的末尾。此表达式返回数组本身,因此可以将多个追加链接在一起。

      【讨论】:

        猜你喜欢
        • 2022-09-28
        • 1970-01-01
        • 2012-05-12
        • 2012-03-12
        • 1970-01-01
        • 2023-04-06
        • 2016-08-17
        • 2011-04-18
        • 1970-01-01
        相关资源
        最近更新 更多