# 全局变量 **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. 你可以在程序的任何地方引用**全局变量**。在对其进行初始化之前,一个全局变量的值是特殊的`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. 过度使用**全局变量**会使隔离Bug变得很困难;它也倾向于表明一个程序的设计并没有经过仔细的考虑。 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). 无论何时,当你发现确实有必要使用**全局变量**时,一定要给它一个描述性的名称,这个名称不太可能在以后因为其他事情而无意中使用它(将其命名为`$foo`很可能是一个坏主意)。 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{puts "$x is now #{$x}"} 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 might be useful for keeping a GUI display up to date. 例如,对于保持GUI展示最新内容,全局变量可能有用。 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: 例如,`$$`包含**Ruby**解释器的进程id,并且是只读的。以下是主要的系统变量: | 标识符 | 类型 | | ---: | --------------------: | | $! | 最新的错误消息 | | $@ | 错误的位置 | | $_ | 最后读取的字符串 | | $. | 解释器读取的最后的行号 | | $& | 最后匹配的正则表达式字符串 | | $~ | 最后的正则表达式匹配,子表达式数组 | | $n | 最后匹配的第N个子表达式 (同$~[n]) | | $= | 不区分大小写的标记 | | $/ | 输入记录分隔符 | | $\ | 输出记录分隔符 | | $0 | Ruby脚本文件的名字 | | $* | 命令行参数 | | $$ | 解释器进程ID | | $? | 执行子进程的最后退出状态 | 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. 它们的名称表明它们应该是全局的,但是它们在这种方式中更有用,使用这些名字有一些历史原因。 [上一章 变量](./variables.md "Variables") [下一章 实例变量](./instancevars.md "Instance variables")