您的位置:首页 > 手游攻略 > 简要解读Ruby面向对象编程中的作用域实用指南

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

作者:互联网  时间: 2026-09-04 18:50:01  

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“简要解读Ruby面向对象编程中的作用域”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

作用域

在这个场景下,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

示例(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

在这个场景下,在一些语言里,比如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

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


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

结合项目来看,用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


hello in the class definition
hello in the method

结合项目来看,采用方法来替代作用域门,能够让一个作用域看到另一个作用域中的变量,这种技术能够称之为“扁平作用域”。

共享作用域

结合项目来看,将一组方法定义到,某个变量的扁平作用域中,能够保证变量仅被有限的几个方法所共享。这种方式称为共享作用域。

您可能感兴趣的文章:
  • Ruby面向对象编程中类的方法与类的扩展
  • Ruby面向对象编程中类与方法的基础学习
  • Ruby的面向对象方式编程学习杂记
  • Ruby的面向对象编程的基础教程
  • Ruby面向对象编程详解
  • ruby 面向对象思维 概念
  • Ruby 面向对象知识总结

最新游戏

更多

Copyright©2010-2019. All rights reserved | 波波三国游戏官网|[email protected]

备案编号:湘ICP备2022015115号-4