$:<< “”做Ruby的需求路径?

时间:2011-12-26 13:46:25

标签: ruby require

我不理解Ruby中$:<< "."的含义。

我将Ruby升级到1.9.1,但程序无效。我的同学告诉我,我应该添加$:<< "."

$:<< "."做什么?

3 个答案:

答案 0 :(得分:23)

  1. $:是包含组成Ruby加载路径的路径数组的变量
  2. <<将一个项目附加到数组的末尾
  3. .指的是当前目录

    1   2  3
    |   |  |
    V   V  V
    $: << "."
    
  4. 所以你要将当前目录添加到Ruby的加载路径

    参考文献:

    1. 可以在The Pragmatic Programmers Guide

      页面的Execution Environment Variables部分找到
        

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

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

        

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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

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

== PROJECT1 / main1.rb:
  $:&lt;&lt; “”   要求'init'
  == PROJECT1 / init.rb:
  把'init 1'

你有类似的项目:

  

== Project2的/ main2.rb:
  $:&lt;&lt; “”   要求'init'
  == 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
  init 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
    

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

  • require_relative仅限Ruby 1.9

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