变量与常量

在 Ruby 之中,变量的类型——局部变量、实例实例变量、类变量、全局变量、常量——是以名称的第一个字符来决定的。通常变量名称,除了第一个字符以外,都是由英数字符或下划线所组成。不过有些内建变量是由「'$' + 一个字符」所组成的。(参考 内建变量

变量或常量会指向特定对象,将对象赋值给变量/常量只是变更了变量指向的对象,因此并不会复制并生成新对象。

局部变量

例:

foobar

以小写字母或是下划线开头的标识符就是局部变量或是方法调用。

在局部变量作用域(类、模块、方法定义体)内,初次对这类的标识符赋值则视为该作用域内的变量声明。引用未声明的标识符则视为调用无参数的方法。

实例变量

例:

@foobar

以 '@' 开头的变量就是实例变量,属于一个特定对象。实例变量可以在本类或子类方法内引用。引用时,未初始化的实例变量值为 nil。

类变量

例:

class Foo
  @@foo = 1
  def bar
    puts @@foo
  end
end

@@ 开头的变量就是类变量。类变量在类定义中声明,可以由类的单例方法和实例方法等引用或赋值。

类变量与 常量 的差异如下:

全局变量

例:

$foobar

以 '$' 开头的变量就是全局变量,可以在程序中任何一处引用(因此使用时要特别注意)。全局变量不需要声明,引用时若未初始化其值为 nil。

伪变量

除了一般变量外,还有一种叫做伪变量的特殊变量。

self

当前方法的执行主体。

nil

NilClass 类唯一的实例。表示伪。

true

TrueClass 类唯一的实例。表示真。

false

FalseClass 类唯一的实例。表示伪。

伪变量的值无法修改,对伪变量赋值会出现语法错误。

常量

例:

FOOBAR

以大写英文字母开头的标识符为常量。对常量赋值就是定义(与初始化)。常量不可在方法中定义。存取未定义常量会产生 NameError 异常。

常量可以在定义常量的类/模块、子类、包含模块的类/模块中引用。在外部引用常量需要使用运算符 '::' 。

class Foo
  FOO = 'FOO'
end

class Bar < Foo
  p FOO             # => "FOO"
end

p Foo::FOO          # => "FOO"

类和模块的名称视为常量处理。