63

Been playing with Ruby on Rails for awhile and decided to take a look through the actual source. Grabbed the repo from GitHub and started looking around. Came across some code that I am not sure what it does or what it references.

I saw this code in 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'

Can someone tell me what the $: (a.k.a. "the bling") is referencing?

Timur Shtatland
  • 12,024
  • 2
  • 30
  • 47
Scott Radcliff
  • 1,501
  • 1
  • 9
  • 13

5 Answers5

73

$ identifies a global variable, as opposed to a local variable, @instance variable, or @@class variable.

Among the language-supplied global variables are $:, which is also identified by $LOAD_PATH

Justin Love
  • 4,397
  • 25
  • 36
38

$: is the global variable used for looking up external files.

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

$: Load path for scripts and binary modules by load or require.

Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
  • 1
    I was redirected to https://www.zenspider.com/ruby/#18 with the link above. Perhaps because of capitalization in the link? This one worked for me: https://www.zenspider.com/ruby/quickref.html#pre-defined-variables . – Julien Lamarche Jun 15 '20 at 17:32
8

I wanna note something weird about Ruby!

$ does indeed mean load path. And ; means "end line". But!

$; means field separator. Try running $;.to_s in your REPL and you'll see it return ",". That's not all! $ with other suffixes can mean many other things.

Why? Well, Perl of course!

Alex Moore-Niemi
  • 2,913
  • 2
  • 24
  • 22
  • Thanks, this was what I was looking for i.e. the use of $ in defining field separators among many other things. – user1175135 Feb 10 '18 at 15:52
4

To quote the Ruby Forum:

ruby comes with a set of predefined variables

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

if i get it right (not 100% sure) this adds the lib path to this array of search paths by going over the current file. which is not exactly the best way, i would simply start with RAILS_ROOT (at least for a rails project)

Bastien Léonard
  • 60,478
  • 20
  • 78
  • 95
Justin Ethier
  • 131,333
  • 52
  • 229
  • 284
3
$:.unshift

is the same as

$LOAD_PATH.unshift

. You can also say:

$: <<
$LOAD_PATH <<

They are pretty common Ruby idioms to set a load path.

TK.
  • 27,073
  • 20
  • 64
  • 72