Global Variables - Rubinius
Author: Less Than Three. <3. http://less.thanthree.com
Description: Rubinius is an implementation of the Ruby programming language. The Rubinius bytecode virtual machine is written in C++. The bytecode compiler is written in pure Ruby. The vast majority of the core library is also written in Ruby, with some supporting primitives that interact with the VM directly.

1.2.3

## Global Variables

This topic has missing or partial documentation. Please help us improve it.

See How-To - Write Documentation

Syntatically, a global variable is supposed to be a variable whose name begins with `$`. Global variables are supposed to be available from any context in a Ruby program. However, there are actually three different kinds of globals: true globals, thread-local globals, and pseudo globals.

True globals associate a value with a global name, such as `$LOAD_PATH`.

Thread-local globals have the syntax of a global variable but there is a different version of the global for each thread in the running Ruby process. Examples of thread-local globals are `$SAFE` and `$!`. To see that these values depend on the thread, consider the following code:

    puts $SAFE

    Thread.new do
      $SAFE = 2
      puts $SAFE
    end

    puts $SAFE

Pseudo globals are a strict subset of names which refer not to global values but values in the current scope, like local variables. These are still referred to as global variables because they start with a dollar sign; this is a source of confusion for users.

All pseudo globals are organized around one primary pseudo global: `$~`. They are all accessing parts of `$~` and thus when `$~` changes, they all change.

The rest of the pseudo globals are: `$&`, `$`` (backtick), `$'` (single quote), `$+`, and `$1`, `$2`, `$3`, etc.

One tricky aspect of these values is that they are strictly bound to the current scope but Ruby allows them to be aliased, as is done in English.rb.

These new aliases are basically adding new local variables to all scopes, even ones already running. Thusly, Rubinius does not fully support them. Instead we simply provide the aliases present in English.rb by default. For example, `$MATCH` can be used instead `$~`, whether English.rb is included or not.