定義很簡單:實例變量@開頭,類變量@@開頭
- 類變量:可以在類方法和類實例方法中訪問,也能被子類繼承,並且子類修改之后,父類的值也會更改。
- 不同的子類都共享這個一個數值,包括子類的實例,都可以來修改這一個值。就理解成:不管自己還是子類的,什么函數都可以訪問,也都可以改,改了之后也是大家共享。
- 實例變量:能被類方法訪問,不能被繼承,子類中賦值不會影響父類。
- 實例變量不能被類實例方法訪問。
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