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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM