我不理解Ruby中$:<< "."
的含义。
我将Ruby升级到1.9.1,但程序无效。我的同学告诉我,我应该添加$:<< "."
$:<< "."
做什么?
答案 0 :(得分:23)
$:
是包含组成Ruby加载路径的路径数组的变量<<
将一个项目附加到数组的末尾 .
指的是当前目录
1 2 3
| | |
V V V
$: << "."
所以你要将当前目录添加到Ruby的加载路径
参考文献:
可以在The Pragmatic Programmers Guide
页面的Execution Environment Variables
部分找到
一个字符串数组,其中每个字符串指定一个目录,用于搜索load脚本和load和require方法使用的二进制扩展。初始值是通过-I命令行选项传递的参数的值,后跟安装定义的标准库位置,后跟当前目录(“。”)[显然此链接适用于旧版本的Ruby因为这还在那里]。可以在程序内设置此变量以更改默认搜索路径;通常,程序使用$:&lt;&lt; dir将dir添加到路径上。
可以在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 / 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将路径名转换为绝对路径名。