`

Ruby变量作用域的类目录结构(补二)

    博客分类:
  • Ruby
阅读更多

ruby中,类中可以定义类,类中可以定义方法,方法中可以定义方法,但是方法中不能定义类。

在前面写的《Ruby变量作用域的类目录结构》和《Ruby变量作用域的类目录结构(补)》中聊到了前两种情况下变量可视域的问题,关于ruby中可以在方法中定义方法这个细节,我也是今天才知道。

首先,ruby的方法中不能定义常量,所以这里只需要考虑实例变量,普通变量,和类变量三种情况

例子一:在irb中敲入以下代码:

ruby 代码
  1. def meth1      
  2.   var = 1      
  3.   def meth2      
  4.     puts var  #报错,因为var是meth1的局部变量,在meth2中是不可见的      
  5.   end     
  6. end     

meth2这个方法怎么调用,实际上有两种方式,1,meth1::meth2,这种情况下,似乎方法名也变成了某种意义上的命名空间,就像是模块命和类名一样;2:在irb提示符下直接敲入meth2,这里遇到问题一,ruby是怎么处理这个嵌套的def的?为什么meth2变成了irb的一个实例方法?

这两种方法感觉有点儿矛盾的地方,如果meth2位于命名空间meth1下,为什么它又是main的实例方法?反之亦然。

例子二:这次我们把meth1放到一个类中,作为类方法

ruby 代码
  1. class A      
  2.   def meth1      
  3.     var = 1      
  4.     def meth2      
  5.       puts var     
  6.     end     
  7.   end     
  8.   def meth3   
  9.     meth1::meth2  
  10.   end  
  11. end    

我试图通过调用meth3来访问嵌套定义的meth2方法,但是这碰到奇怪的现象,meth2通过meth1::meth2无法访问?总是提示找不到meth2方法,但是在例子1中,基本上一样的定义,通过meth1::meth2却可以调用meth2,非常奇怪。没有看过ruby的源码,那位高人了解,麻烦解释一下。所在在这里只能通过A.new.meth2来调用meth2方法。抛开问题不管,在A.new中调用meth2当然是错的,因为meth2中没有定义局部变量var。

例子三:类似于例子二中的结构,不过这次定义了一个实例变量@var,并且另外定义了一个方法meth3用来打印@var

ruby 代码
  1. class A         
  2.   def meth1         
  3.     @var = 1         
  4.     def meth2         
  5.       puts @var        
  6.     end        
  7.   end        
  8.   def meth3      
  9.     puts @var     
  10.   end     
  11. end     
  12.   
  13. a = A.new     
  14. a.meth1      
  15. a.meth2 => 1      
  16. a.meth3 => 1    

可以看到调用meth2和meth3都可以正确的打印出@var的值

对于类变量的例子,结果和例子三类似。就不多说了。


 

分享到:
评论
1 楼 t284299773 2011-05-05  
你在方法中定义方法就相当于在方法中调用lambda!

相关推荐

    Ruby语言教程:Ruby 变量示例

    - 这类变量的作用域取决于它被定义的位置。例如,在方法内部定义的变量仅在该方法内部可见。 - **示例代码**: ```ruby # 普通变量示例 name = "Ruby" puts name # 输出 "Ruby" ``` ##### 2. 全局变量 ...

    01Ruby 变量.docx

    Ruby 支持多种类型的变量,它们根据不同的作用域和用途有着明确的区别: 1. **变量 (Variable)**:一般由小写字母或下划线开头。 2. **全局变量 (Global variable)**:以 `$` 开头。 3. **实例变量 (Instance ...

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

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

    Ruby中类变量和实例变量的比较

    ### Ruby中类变量和实例变量的比较 在Ruby编程语言中,类变量和实例变量都是用来存储数据的重要机制。它们虽然都是变量,但在用途、作用范围、生命周期等方面有着明显的区别。接下来,我们将详细介绍这两者之间的四...

    Ruby - Ruby for Rails

    - **变量作用域**:讲解变量的作用域规则,包括局部作用域、块作用域、类作用域等。 - **动态类型**:探讨 Ruby 的动态类型系统,了解如何根据运行时的数据类型进行操作。 #### 2.2 使用类组织对象 - **类定义**:...

    Ruby 基础语法 视频教程1

    - **全局变量**(Global Variables):以`$`开头,其作用域在整个程序中,如`$debug = true`。 - **常量**(Constants):以大写字母开头,表示不变的值,如`PI = 3.14`,但实际并非完全不可变。 2. 变量规则...

    ruby官方chm文档

    《ruby23-language.chm》文档深入讲解了Ruby语言的特性,如动态性、元编程、闭包和块、方法定义与调用、变量作用域等。Ruby允许在运行时修改代码,这使得元编程成为其强大之处。理解如何使用`eval`、`class_eval`和`...

    ruby语言帮助文档(简体中文)

    块可以与方法一起使用,形成闭包,这样就可以在方法中捕获并操作外部作用域的变量。 6. **元编程**:Ruby的元编程能力非常强大,允许在运行时修改和创建类和对象。这得益于Ruby的反射API和`send`方法,可以动态地...

    深入分析Ruby 变量

    在Ruby中,有五种主要的变量类型,每种都有其特定的作用域和用途。 1. 变量(Variable):通常以小写字母或下划线开头。它们在局部作用域内有效,即只在其定义的代码块内部可访问。例如: ```ruby x = 10 ``` 这里...

    ruby 中文 教程 从入门到精通

    - **标识名和变量作用域**:Ruby中的变量根据作用域可分为局部变量、实例变量、类变量和全局变量。 - **数据类型**:Ruby支持多种内置的数据类型,如整型、浮点型、字符串、数组、哈希等。 - **赋值和条件运算符**:...

    ruby trap 初学者使用

    理解它们的作用域和用法是避免陷阱的关键。 - 常量在Ruby中是可变的,但改变常量值会引发警告,初学者应避免随意修改。 2. **符号(Symbol)**: - 符号是Ruby中的一种特殊数据类型,它们是不可变的,常用于哈希...

    .一步一步学RUBY

    变量分为局部变量、全局变量、实例变量和类变量,每种变量的作用域和生命周期不同,提供了灵活的数据封装和访问控制。 **常量**以大写字母开头,尽管Ruby允许对常量进行重新赋值,但这将触发警告,强调常量应保持...

    Ruby In a Nutshell

    - 闭包是指能够访问其定义时作用域的变量的块,即使在块被调用时该作用域已不存在。 8. ** Proc和Lambda** - `Proc`和`lambda`都是Ruby的代码对象,可以存储和传递代码。 - `Proc`更灵活,允许在块末尾隐式返回...

    Programming-Ruby-1.9源代码

    - 变量:Ruby支持局部变量、实例变量、类变量和全局变量,源代码中会展示它们的用法和作用域。 - 数据类型:包括字符串、数字、布尔值、数组、哈希等,通过代码你可以看到它们的操作和转换方式。 - 控制结构:如...

    Ruby从入门到精通pdf

    - 闭包:块可以捕获其定义时的作用域内的变量,形成闭包,这使得Ruby的回调函数和函数式编程特性得以实现。 4. **模块**: - 模块用来组织代码,提供命名空间,也可以作为混入机制,实现代码复用。 - include...

    ruby for rails

    4. **The default object (self) and scope**:Ruby中的`self`关键字,它如何指示方法调用的目标对象,以及作用域规则,包括局部作用域、实例作用域和类作用域。 5. **Control flow techniques**:控制流程的技巧,...

    ruby_知识库pdf

    这篇“ruby_知识库pdf”很可能包含了关于Ruby语言的深入讲解,包括基础概念、核心特性、类与对象、模块、方法、块、 Proc 和 Lambda、变量作用域、控制结构、异常处理、标准库、Gem包管理以及可能的Rails框架等内容...

    Ruby语言中文教程

    闭包是指能够访问其定义时作用域的代码块,即使在定义它的上下文之外也能保持对变量的访问。Ruby的块、Proc和Lambda都是闭包的实现形式。 八、元编程 Ruby的元编程能力强大,允许在运行时修改类和对象。`class ...

Global site tag (gtag.js) - Google Analytics