63

一直在使用 Ruby on Rails 并决定查看实际源代码。从 GitHub 上获取 repo 并开始四处寻找。遇到一些我不确定它做什么或它引用什么的代码。

我在 actionmailer/test/abstract_unit.rb 中看到了这段代码

root = File.expand_path('../../..', __FILE__)
 begin
 require "#{root}/vendor/gems/environment"
 rescue LoadError
 $:.unshift("#{root}/activesupport/lib")
 $:.unshift("#{root}/actionpack/lib")
end

lib = File.expand_path("#{File.dirname(__FILE__)}/../lib")
$:.unshift(lib) unless $:.include?('lib') || $:.include?(lib)

require 'rubygems'
require 'test/unit'

require 'action_mailer'
require 'action_mailer/test_case'

有人能告诉我 $: (又名“金光闪闪”)指的是什么吗?

4

5 回答 5

70

$标识全局变量,而不是局部变量、@instance 变量或@@class 变量。

在语言提供的全局变量中有$:,也由$LOAD_PATH

于 2009-12-13T16:31:46.583 回答
38

$: 是用于查找外部文件的全局变量。

来自http://www.zenspider.com/Languages/Ruby/QuickRef.html#18

$:通过 load 或 require 加载脚本和二进制模块的路径。

于 2009-12-13T15:59:56.387 回答
8

我想指出一些关于 Ruby 的奇怪之处!

$确实意味着加载路径。并;表示“终点线”。但!

$;表示字段分隔符。尝试$;.to_s在你的 REPL 中运行,你会看到它返回","。那不是全部!$带有其他后缀可以表示许多其他的东西

为什么?好吧,当然是 Perl!

于 2017-11-01T02:06:50.970 回答
4

引用Ruby 论坛:

ruby 带有一组预定义的变量

$: = default search path (array of paths)
__FILE__ = current sourcefile

如果我做对了(不是 100% 确定),这将通过遍历当前文件将 lib 路径添加到这个搜索路径数组中。这不是最好的方法,我会简单地从 RAILS_ROOT 开始(至少对于 rails 项目)

于 2009-12-13T16:00:48.180 回答
3
$:.unshift

是相同的

$LOAD_PATH.unshift

. 你也可以说:

$: <<
$LOAD_PATH <<

它们是设置加载路径的非常常见的 Ruby 习惯用法。

于 2009-12-13T16:08:38.900 回答