在 Ruby 之中,变量的类型——局部变量、实例实例变量、类变量、全局变量、常量——是以名称的第一个字符来决定的。通常变量名称,除了第一个字符以外,都是由英数字符或下划线所组成。不过有些内建变量是由「'$' + 一个字符」所组成的。(参考 内建变量)
变量或常量会指向特定对象,将对象赋值给变量/常量只是变更了变量指向的对象,因此并不会复制并生成新对象。
例:
foobar
以小写字母或是下划线开头的标识符就是局部变量或是方法调用。
在局部变量作用域(类、模块、方法定义体)内,初次对这类的标识符赋值则视为该作用域内的变量声明。引用未声明的标识符则视为调用无参数的方法。
例:
@foobar
以 '@' 开头的变量就是实例变量,属于一个特定对象。实例变量可以在本类或子类方法内引用。引用时,未初始化的实例变量值为 nil。
例:
class Foo @@foo = 1 def bar puts @@foo end end
以 @@
开头的变量就是类变量。类变量在类定义中声明,可以由类的单例方法和实例方法等引用或赋值。
类变量与 常量 的差异如下:
例:
$foobar
以 '$' 开头的变量就是全局变量,可以在程序中任何一处引用(因此使用时要特别注意)。全局变量不需要声明,引用时若未初始化其值为 nil。
除了一般变量外,还有一种叫做伪变量的特殊变量。
当前方法的执行主体。
NilClass 类唯一的实例。表示伪。
TrueClass 类唯一的实例。表示真。
FalseClass 类唯一的实例。表示伪。
伪变量的值无法修改,对伪变量赋值会出现语法错误。
例:
FOOBAR
以大写英文字母开头的标识符为常量。对常量赋值就是定义(与初始化)。常量不可在方法中定义。存取未定义常量会产生 NameError 异常。
常量可以在定义常量的类/模块、子类、包含模块的类/模块中引用。在外部引用常量需要使用运算符 '::' 。
class Foo FOO = 'FOO' end class Bar < Foo p FOO # => "FOO" end p Foo::FOO # => "FOO"
类和模块的名称视为常量处理。