• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    简要解读Ruby面向对象编程中的作用域
    POST TIME:2021-10-18 15:18

    作用域

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

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

    上面三个关键字,每个关键字对应一个作用域门(进入),相应的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 面向对象知识总结
    上一篇:Ruby的面向对象方式编程学习杂记
    下一篇:详解Ruby中的instance_eval方法及其与class_eval的对比
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信