Что означает символ " $ " в Ruby?


некоторое время играл с Ruby on Rails и решил взглянуть на фактический источник. Схватил РЕПО с GitHub и начал осматриваться. Наткнулся на какой-то код, который я не уверен, что он делает или на что он ссылается.

Я видел этот код в actionmailer / test / abstract_unit.РБ

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'

может кто-нибудь сказать мне, что $: (a.k.a. "bling") ссылается?

5 57

5 ответов:

$: глобальная переменная, используемая для поиска внешних файлов.

от http://www.zenspider.com/Languages/Ruby/QuickRef.html#18

$: путь загрузки для скриптов и двоичных модулей по загрузке или требованию.

$ определяет глобальную переменную, в отличие от локальной переменной, переменной @instance или переменной @@class.

среди предоставленных языком глобальных переменных есть $:, который также определен $LOAD_PATH

цитировать Форум Руби:

ruby поставляется с набором предопределенных переменных

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

если я правильно понял (не на 100% уверен), это добавляет путь lib к этому массиву путей поиска, перейдя по текущему файлу. что не совсем так лучший способ, я бы просто начал с RAILS_ROOT (по крайней мере, для рельсов проект)

$:.unshift

это то же самое, что

$LOAD_PATH.unshift

. Вы также можете сказать:

$: <<
$LOAD_PATH <<

Они довольно распространенные идиомы Ruby, чтобы установить путь загрузки.

Я хочу отметить что-то странное о Руби!

$ действительно означает путь загрузки. И ; означает "конец линии". Но!

$; означает разделитель полей. Попробуйте запустить $;.to_s в вашем REPL, и вы увидите, что он возвращается ",". Это еще не все! $ с другими суффиксами может означать многое другое.

почему? Ну, Perl конечно!