在ruby代码中,变量拥有自己的可视区域,也就是变量的作用域,我们可以把ruby的程序看作是一种类目录结构,根据嵌套的层次,一层层的深入到子目录,子子目录。。。可以认为,模块,类,方法都是目录
例如我们举一个类作为例子:
ruby 代码
- class A #可以将它看作顶级目录,例如linux下的'/'
- Const_var = "const variable" #它可以想像成位于'/'目录下的一个文件
- var = "var in '/'"
- def print_var
- puts Const_var #'/'目录下的一个子文件夹
- end
- class SubClass #'/'目录下的一个子文件夹
- Const_var_another = "another const variable" #'/SubClass/'这个目录下的一个文件
- var = "var in '/SubClass'" #'/SubClass/'这个目录下的另一个文件
- end
- end
对于普通的局部变量(小写字母或者下划线开头的变量)就像在文件系统中一样,某一个文件的可见作用域仅仅在本文件夹中,其他文件夹包括此文件夹的子文件夹中,这个文件都是不可见的,任何对于此文件(变量)的操作都必须在此文件的可见域中进行
ruby 代码
- class A
- var = "ok"
- def print_var
- puts var #报错,因为var不可见
- end
- class SubA
- puts var #报错,因为var不可见
- end
- end
- class B
- puts var #报错,因为var在另外一个目录中同样不可见
- end
对于常量(大写字母开头的变量),有一些不同,常量对于常量所在文件夹中的子文件夹也是可见的
ruby 代码
- class A
- Const_var = "ok"
- def print_var
- puts Const_var #正确,因为Const_var对于子目录可见
- end
- class SubA
- puts Const_var #正确,因为Const_var对于子目录可见
- end
- end
- class B
- puts var #报错,因为Const_var在另外一个目录中不可见
- end
而类的instance_variable,同常量类似,不同之处在于它的向子目录可视性仅仅对于方法有效,对于另外一个类无效:
ruby 代码
- class A
- @var = "ok"
- def print_var
- puts @var #正确,因为@var对于子目录可见
- end
- class SubA
- puts @ar #错误,因为此时已经在另外一个类中,类A的instance_variable是不可视的
- end
- end
- class B
- puts @var #报错,因为@var在另外一个目录中不可见
- end
对于类变量(以@@开头的变量),可是域上同常量的效果完全一致,唯一的不同是常量可以通过目录结构来访问,例如类A中的常量Const可以通过A::Const来访问,而类变量不行。