Prev | Contents | Next

| Ruby user's guide | Global variables |

A global variable has a name beginning with `$`. It can be referred to from anywhere in a program. Before initialization, a global variable has the special value `nil`.

    ruby> $foo
       nil
    ruby> $foo = 5
       5
    ruby> $foo
       5

Global variables should be used sparingly. They are dangerous because they can be written to from anywhere. Overuse of globals can make isolating bugs difficult; it also tends to indicate that the design of a program has not been carefully thought out. Whenever you do find it necessary to use a global variable, be sure to give it a descriptive name that is unlikely to be inadvertently used for something else later (calling it something like `$foo` as above is probably a bad idea).

One nice feature of a global variable is that it can be traced; you can specify a procedure which is invoked whenever the value of the variable is changed.

    ruby> trace_var :$x, proc{print "$x is now ", $x, "\n"}
       nil
    ruby> $x = 5
    $x is now 5
       5

When a global variable has been rigged to work as a trigger to invoke a procedure whenever changed, we sometimes call it an active variable. For instance, it is useful for keeping a GUI display up to date.

There is a collection of special variables whose names consist of a dollar sign (`$`) followed by a single character. For example, `$$` contains the process id of the ruby interpreter, and is read-only. Here are the major system variables and their meanings (see the ruby reference manual for details):

`$!` | latest error message
`$@` | location of error
`$_` | string last read by `gets`
`$.` | line number last read by interpreter
`$&` | string last matched by regexp
`$~` | the last regexp match, as an array of subexpressions
`$`n | the nth subexpression in the last match (same as `$~[`n`]`)
`$=` | case-insensitivity flag
`$/` | input record separator
`$\` | output record separator
`$0` | the name of the ruby script file
`$*` | the command line arguments
`$$` | interpreter's process ID
`$?` | exit status of last executed child process

In the above, `$_` and `$~` have local scope. Their names suggest they should be global, but they are much more useful this way, and there are historical reasons for using these names.

Prev | Contents | Next