Ruby变量作用域的类目录结构

在ruby代码中,变量拥有自己的可视区域,也就是变量的作用域,我们可以把ruby的程序看作是一种类目录结构,根据嵌套的层次,一层层的深入到子目录,子子目录。。。可以认为,模块,类,方法都是目录

例如我们举一个类作为例子:

ruby 代码
  1. class A #可以将它看作顶级目录,例如linux下的'/'   
  2.   Const_var = "const variable" #它可以想像成位于'/'目录下的一个文件   
  3.   var = "var in '/'"
  4.   def print_var
  5.     puts Const_var #'/'目录下的一个子文件夹
  6.   end
  7.   class SubClass #'/'目录下的一个子文件夹   
  8.      Const_var_another = "another const variable"  #'/SubClass/'这个目录下的一个文件   
  9.      var = "var in '/SubClass'" #'/SubClass/'这个目录下的另一个文件   
  10.   end  
  11. end  

对于普通的局部变量(小写字母或者下划线开头的变量)就像在文件系统中一样,某一个文件的可见作用域仅仅在本文件夹中,其他文件夹包括此文件夹的子文件夹中,这个文件都是不可见的,任何对于此文件(变量)的操作都必须在此文件的可见域中进行

ruby 代码
  1. class A   
  2.   var = "ok"  
  3.   def print_var
  4.     puts var #报错,因为var不可见
  5.   end
  6.   class SubA   
  7.     puts var #报错,因为var不可见   
  8.   end  
  9. end  
  10.   
  11. class B   
  12.   puts var #报错,因为var在另外一个目录中同样不可见   
  13. end  

对于常量(大写字母开头的变量),有一些不同,常量对于常量所在文件夹中的子文件夹也是可见的

ruby 代码
  1. class A      
  2.   Const_var = "ok"   
  3.   def print_var
  4.     puts Const_var #正确,因为Const_var对于子目录可见
  5.   end
  6.   
  7.   class SubA      
  8.     puts Const_var #正确,因为Const_var对于子目录可见   
  9.   end     
  10. end     
  11.      
  12. class B      
  13.   puts var #报错,因为Const_var在另外一个目录中不可见      
  14. end   

而类的instance_variable,同常量类似,不同之处在于它的向子目录可视性仅仅对于方法有效,对于另外一个类无效:

ruby 代码
  1. class A         
  2.   @var = "ok"      
  3.   
  4.   def print_var   
  5.     puts @var #正确,因为@var对于子目录可见   
  6.   end  
  7.      
  8.   class SubA         
  9.     puts @ar #错误,因为此时已经在另外一个类中,类A的instance_variable是不可视的   
  10.   end        
  11. end        
  12.         
  13. class B         
  14.   puts @var #报错,因为@var在另外一个目录中不可见         
  15. end  

对于类变量(以@@开头的变量),可是域上同常量的效果完全一致,唯一的不同是常量可以通过目录结构来访问,例如类A中的常量Const可以通过A::Const来访问,而类变量不行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值