`

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

    博客分类:
  • 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来访问,而类变量不行。

分享到:
评论
3 楼 flingfox63 2012-11-22  
学习了,详细,赞个
2 楼 zhou6711411 2011-11-16  
不知是版本问题还是怎么的
class A         
  @var = "ok"      
  
  def print_var   
    puts @var #正确,因为@var对于子目录可见   
  end  

end

这段貌似行不通了。
1 楼 xanderzhang 2008-09-16  
哈哈 这样理解就容易些了 谢谢

相关推荐

    简要解读Ruby面向对象编程中的作用域

    Ruby中不具备嵌套作用域(即在内部作用域,可以看到外部作用域的)的特点,它的作用域是截然分开的,一旦进入一个新的作用域,原先的绑定会被替换为一组新的绑定。 程序会在三个地方关闭前一个作用域,同时打开一个新...

    Ruby中的Proc类及Proc的类方法Proc.new的使用解析

    Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量)。 在下例中,正...

    关于PHP常见面试题.pdf

    3. PHP中的变量作用域是什么?请说明在PHP中的变量作用域规则。 4. PHP中如何进行错误处理(Error Handling)?请说明在PHP中的错误处理机制。 5. 什么是PHP中的超全局变量(Superglobals)?请列举几个常用的PHP超...

    Linux C程序设计大全

    3.2 变量的作用域和生命期 3.2.1 全局变量 3.2.2 局部变量 3.3 变量的初始值 3.3.1 全局变量的初始值 3.3.2 局部变量的初始值 3.4 与函数有关的优化 3.4.1 函数调用与程序优化 3.4.2 变量存储优化 3.5 编写多文件...

    Ruby语言入门教程

    3.5 标识名和变量的作用域..................................................................................................19 3.6 类库......................................................................

    JavaScript权威指南(第6版)(附源码)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    JavaScript权威指南(第六版) 清晰-完整

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    JavaScript权威指南(第6版)(中文版)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    JavaScript权威指南(第6版)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    javaSE代码实例

    6.7.1 局部变量的作用域 89 6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9 擅用系统已有的类 94 6.9.1 Java中的Date类 94 6.9.2 Java中的GregorianCalendar类 96 6.9.3 擅用系统已有类的...

    JavaScript权威指南(第6版)

    3.10 变量作用域 56 第4章 表达式和运算符 60 4.1 原始表达式 60 4.2 对象和数组的初始化表达式 61 4.3 函数定义表达式 62 4.4 属性访问表达式 63 4.5 调用表达式 64 4.6 对象创建表达式 64 4.7 运算符概述 65 4.8 ...

    JavaScript权威指南(第6版)中文文字版

    3.10 变量作用域 56 第4章 表达式和运算符 60 4.1 原始表达式 60 4.2 对象和数组的初始化表达式 61 4.3 函数定义表达式 62 4.4 属性访问表达式 63 4.5 调用表达式 64 4.6 对象创建表达式 64 4.7 运算符概述 65 4.8 ...

    augeasproviders:基于Augeas的其他Puppet提供商

    augeasproviders:Puppet的基于Augeas...班级augeasproviders :: instances 此类允许使用类的参数或顶级作用域变量定义此模块提供的类型。 注意:类的参数优先于顶级变量。 将sysctl条目net.ipv4.ip_forward设置为1 :

    Java中的闭包与回调

    “闭包”一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python...

    Scala程序设计(第2版)

    13.6 作用域内私有和作用域内受保护可见性 306 13.7 对可见性的想法 312 13.8 本章回顾与下一章提要 313 第14章 Scala类型系统(I) 314 14.1 参数化类型 315 14.1.1 变异标记 315 14.1.2 类型...

    bounty-targets:该项目每小时抓取漏洞赏金平台作用域(例如HackeroneBugcrowdIntigritietc),并将其转储到赏金目标数据存储库中

    设置以下环境变量: SENTRY_DSN :(可选)用于异常跟踪的 API密钥。 SSH_PRIV_KEY :SSH私钥,已授权其写入要向其中推送数据的github项目。 SSH_PUB_KEY :对应于SSH_PRIV_KEY 。 GIT_HOST :要写入的github...

    python 参数列表中的self 显式不等于冗余

    例如,它提供了一种作用域机制,我个人认为比Ruby的@和@@清晰多了,这可能是习惯使然吧,但它确实和C++、Java中的this很相似。 然而,self总是有令我困扰的地方,我以前在这里说过—我曾幻想能在Python3中这些能得以...

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    与作用域 175 14.2 GSP标签库 175 14.2.1 常用的内置标签 176 14.2.2 开发自定义标签 179 14.3 Grails对Ajax的支持 182 14.4 本章小结 184 第15章 实现Web Service 185 15.1 REST风格的Web Service 185 15.1.1 什么...

    精通正则表达式~~~

    动态作用域及正则匹配效应... 295 匹配修改的特殊变量... 299 qr/…/运算符与regex对象... 303 构建和使用regex对象... 303 探究regex对象... 305 用regex对象提高效率... 306 Match运算符... 306 Match的...

Global site tag (gtag.js) - Google Analytics