ruby中的实例变量和类变量

定义很简单:实例变量@开头,类变量@@开头
  1. 类变量:可以在类方法和类实例方法中访问,也能被子类继承,并且子类修改之后,父类的值也会更改。
    • 不同的子类都共享这个一个数值,包括子类的实例,都可以来修改这一个值。就理解成:不管自己还是子类的,什么函数都可以访问,也都可以改,改了之后也是大家共享。
  2. 实例变量:能被类方法访问,不能被继承,子类中赋值不会影响父类。
    • 实例变量不能被类实例方法访问。
 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

 

posted on 2016-12-23 21:48  Liz-  阅读(3525)  评论(3编辑  收藏  举报