Scope- ruby中变量的作用范围

ruby中变量的作用范围有3种

1. Class definitions

2. Modle definitions

3. Method

当程序从一个class,或者module,或者method进入(退出)时,作用域就会改变,对应的3个关键字为:class module,和 def, 每一个关键字的位置就是作用域的入口。

Ruby代码  Scope- ruby中变量的作用范围
  1. v1 = 1                       #top-level scope  
  2.   
  3. class MyClass            #enter class scope  
  4.   v2 = 2  
  5.   puts local_variables  
  6.   def fun                     #enter method scope  
  7.     v3 = 3  
  8.    puts local_variables  
  9.   end  
  10.   puts local_variables  
  11. end  
  12.   
  13. a = MyClass.new  
  14. a.fun  
  15. a.fun  
  16. puts local_variables  

这段程序中有4个作用域,  顶层的作用域, 进入class时的作用域, 和两次调用fun时的作用域

 class和module的作用域于method的不同,当定义class或者module时,其中的代码会立即执行,也就是作用域会立即形成,而method的作用域是再真正调用时才会形成。

当程序从一个作用域跳到另一个作用域时,本地变量就会超出作用域,那么如何让一个变量进入到两个不用的作用域呢?

Ruby代码  Scope- ruby中变量的作用范围
  1. my_var = "Success"  
  2.   
  3. class MyClass1  
  4.   puts "#{my_var} in the class definition"  
  5.   
  6.   def my_method  
  7.     puts "#{my_var} in the method definition"  
  8.   end  
  9. end  

这段程序中,想让变量同时作用于class和method,显然,从顶层的作用域到关键字class时,作用域会发生改变,所以在class中 puts "#{my_var} in the class definition" 会抛出异常,undefined local variable or method `my_var', 同样,在方法my_method中也会抛出异常。

作用域的改变是再遇到关键字:class ,module,或者 method 时,所以要想让变量能够被使用,就要避免作用域的改变,也就是说,使用其他方法替换掉 class 和 method

Ruby代码  Scope- ruby中变量的作用范围
  1. MyClass1 = Class.new do  
  2.   puts "#{my_var} in the class definition"  
  3.   my_var = ""  
  4.   
  5.   define_method :my_method do  
  6.     puts "#{my_var} in the method definition"  
  7.   end  
  8. end  
  9.   
  10. MyClass1.new.my_method  

这种从在一个作用域中使用另一个作用域中的变量,称之为:flatten the scope 简称: Flat Scope

那么,现在假设你想在几个方法中共享一个变量,而不想让其他人来访问这些变量,你就可以这样写:

Ruby代码  Scope- ruby中变量的作用范围
  1. def define_methods  
  2.   shared = 0  
  3.   
  4.   Kernel.send :define_method, :counter do  
  5.     shared  
  6.     puts shared  
  7.   end  
  8.   
  9.   Kernel.send :define_method, :inc do |x|  
  10.     shared += x  
  11.     puts shared  
  12.   end  
  13. end  
  14.   
  15. define_methods  
  16. counter  
  17. inc(4)  
  18. counter  

输出结果为:

4

4

这种称之为: Shared Scope

相关推荐