• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > 简要解读Ruby面向对象编程中的作用域

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

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了面向对象,什么是面向对象,java面向对象,面向对象编程思想,面向对象的特征等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

作用域

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

程序会在三个地方关闭前一个作用域,同时打开一个新的作用域,它们是:

  • 类定义class
  • 模块定义 module
  • 方法定义 def

上面三个关键字,每个关键字对应一个作用域门(进入),相应的end则对应离开这道门。

扁平化作用域

从一个作用域进入另一个作用域的时候,局部变量会立即失效,为了让局部变量持续有效,可以通过规避关键字的方式,使用方法调用来代替作用域门,让一个作用域看到另一个作用域里的变量,从而达到目的。具体做法是,通过Class.new替代class,Module#define_method代替def,Module.new代替module。这种做法称为扁平作用域,表示两个作用域挤压到一起。

示例代码(Wrong)

my_var = “Success”
class MyClass
  puts my_var #这里无法正确打印”Success”
  def my_method
    puts my_var #这里无法正确打印”Success”
  end
end
</div>

示例代码(Right)

my_var = “Success”
MyClass = Class.new do
  puts “#{my_var} in the class definition”
  define_method :my_method do
    “#{my_var} in the method”
  end
end

</div>

在一些语言中,比如java或C#,有内部作用域(inner scope)的概念。在内部作用域可以看到外部作用域(outer scope)中的变量。但ruby中没有这种嵌套式作用域的概念,它的作用域是截然分开的,一旦进入一个新的作用域,原先的绑定就会被替代为一组新的绑定。

在ruby中,程序会在三个地方关闭前一个作用域,同时打开一个新的作用域:类定义、模块定义、方法。

只要程序进入类、模块或者方法的定义,就会发生作用域切换。这三个边界分别用class,module和def关键字作为标志,每一个关键字都充当了一个作用域门(scope gate)。

怎样让绑定穿越一个作用域门呢?比如下面的代码:

my_var = “hello”
class MyClass
     #你希望在这里能打印my_var
     def my_method
          #...还有这里
     end
end
</div>

在进入另一个作用域时,局部变量会立刻失效。如果把class关键字替换为某个非作用域门的东西,比如方法,就能在一个闭包中获得my_var的值,并把这个闭包传递给该方法。代码如下:

my_var = “hello”
MyClass = Class.new do
     puts “#{my_var} in the class definition”
     def my_method
          #...这里怎样打印出来呢?
     end
end
</div>

用Module#define_method()方法可以替代def,代码如下:

my_var = “hello”
MyClass = Class.new do
     puts “#{my_var} in the class definition”
     define_method :my_method do
          puts “#{my_var} in the method”
     end
end


 
MyClass.new.my_method

</div>
hello in the class definition
hello in the method

</div> 使用方法来替代作用域门,可以让一个作用域看到另一个作用域中的变量,这种技术可以称之为“扁平作用域”。</div>

共享作用域

将一组方法定义到,某个变量的扁平作用域中,可以保证变量仅被有限的几个方法所共享。这种方式称为共享作用域。

</div>

您可能想查找下面的文章:

  • Ruby面向对象编程详解
  • ruby 面向对象思维 概念
  • Ruby面向对象编程中类的方法与类的扩展
  • Ruby面向对象编程中类与方法的基础学习
  • 简要解读Ruby面向对象编程中的作用域
  • Ruby的面向对象方式编程学习杂记
  • Ruby的面向对象编程的基础教程

相关文章

  • ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)
  • 在Ruby中创建和使用哈希的教程
  • 快速正确的安装 Ruby, Rails 运行环境
  • 利用Ruby的SOAP4R编写SOAP服务器的教程
  • ruby 过程对象 解析
  • 详解Ruby当中的算数运算
  • Ruby简明教程之循环语句介绍
  • Ruby常量查找路径问题深入研究
  • Ruby遍历文件夹同时计算文件的md5sum
  • Ruby实现命令行中查看函数源码的方法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Ruby中变量引用时的一些注意点
    • Ruby实现网页图片抓取
    • 使用Ruby on Rails和PostgreSQL自动生成UUID的教程
    • Ruby on Rails中的ActiveRecord编程指南
    • Ruby中的return、break、next详解
    • Ruby实现批量对文件增加前缀代码分享
    • Ruby的安装与运行
    • ruby开发的交互式程序例子
    • Ruby rails 页面跳转(render和redirect_to)
    • Ruby常量查找路径问题深入研究

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有