ruby中的实例变量和类变量
定义很简单:实例变量@开头,类变量@@开头
- 类变量:可以在类方法和类实例方法中访问,也能被子类继承,并且子类修改之后,父类的值也会更改。
- 不同的子类都共享这个一个数值,包括子类的实例,都可以来修改这一个值。就理解成:不管自己还是子类的,什么函数都可以访问,也都可以改,改了之后也是大家共享。
- 实例变量:能被类方法访问,不能被继承,子类中赋值不会影响父类。
- 实例变量不能被类实例方法访问。
1 class Test 2 @@class_var = 10 3 @class_instance_var = 1 4 #类方法: 两种变量都可以访问 5 def self.outclass_var 6 puts @@class_var 7 end 8 def self.outclass_instance_var 9 puts @class_instance_var 10 end 11 #类实例方法: 不能访问类实例变量 12 def outclass_var 13 puts @@class_var 14 end 15 def outclass_instance_var 16 puts @class_instance_var 17 end 18 end 19 20 #如果两个变量不初始化,这里就打印不出来。不知道是不是版本的问题 21 puts Test.class_variables #=>@@class_var 22 puts Test.instance_variables #=>@class_instance_var 23 24 #类变量,可以被子类共享且修改 25 class SubCls < Test 26 @@class_var = 12 27 end 28 29 #可以看到现在类变量值都被修改了 30 Test.outclass_var #=>12 31 SubCls.outclass_var #=>12 32 33 #子类无法继承父类的实例变量 34 Test.outclass_instance_var #=>1 35 SubCls.outclass_instance_var #=>空 36 37 38 #类实例方法不能访问实例变量 39 Test.new.outclass_var #=>12 40 Test.new.outclass_instance_var #空 41 42 #再看一下子类,和父类的情况相同 43 SubCls.new.outclass_var #=>12 44 SubCls.new.outclass_instance_var #空
读《Ruby元编程》时看到了这样一段代码,值得深思。
1 class Greeting 2 @classtext = "world" 3 def initialize(text) 4 @text = text 5 puts @classtext #=>不能访问 打印为空 6 end 7 def welcome 8 puts "#{@text},#{@classtext}" 9 end 10 end 11 def classtext 12 puts @classtext 13 end 14 15 g = Greeting.new("hello") 16 g.welcome #=>hello, 不能打印@classtext 17 puts g.instance_variables #@text 18 puts Greeting.instance_variables #@classtext