2010-11-17 114 views
4

我明白(我認爲)Ruby中一個類的類變量和實例變量之間的區別。從外部訪問一個類的實例變量

我在想如何從外部那個類訪問類的實例變量。

從內部(即在類方法而不是實例方法中),它可以直接訪問,但是從外部來看,有沒有辦法做到這一點MyClass.class.[@$#]variablename

我沒有任何具體的理由這樣做,只是學習Ruby,並想知道是否有可能。

回答

5
class MyClass 

    @my_class_instance_var = "foo" 

    class << self 
     attr_accessor :my_class_instance_var 
    end 

end 

puts MyClass::my_class_instance_var 

上述收益率:

>> foo 

我相信Arkku演示瞭如何訪問類變量(@@),而不是類實例從類的外部變量(@)。

我吸引了來自本文前述:Seeing Metaclasses Clearly

2

Ruby有類,類對象和實例。

一個類變量屬於一個類。
一個類的實例變量 屬於一個類對象

類變量:

無障礙類及其實例內。
attr_accessor對類變量不起作用。

類的實例變量:

無障礙只能通過類。
attr_accessor如果在類中定義它,而不是在類對象中定義,則如下所示。

class A 
    @b = 1 
    class << self 
     attr_accessor :b 
    end 
end 

在定義上的實例的吸氣劑和setter爲類的實例變量b:

class A 
    @b = 1 
    class << self 
     attr_accessor :b 
    end 
    def b 
     A.b 
    end 
    def b=(value) 
     A.b=value 
    end 
end 

現在類的實例變量b可通過所有者類及其實例進行訪問。
作爲一個幾天的紅寶石學習者,這是我能做的最多的。

`irb(main):021:0* class A 
irb(main):022:1> @b = 1 
irb(main):023:1> class << self 
irb(main):024:2> attr_accessor :b 
irb(main):025:2> end 
irb(main):026:1> def b 
irb(main):027:2> A.b 
irb(main):028:2> end 
irb(main):029:1> def b=(v) 
irb(main):030:2> A.b=v 
irb(main):031:2> end 
irb(main):032:1> end 
=> :b= 
irb(main):033:0> A.b 
=> 1 
irb(main):034:0> c = A.new 
=> #<A:0x00000003054440> 
irb(main):035:0> c.b 
=> 1 
irb(main):036:0> c.b= 50 
=> 50 
irb(main):037:0> A.b 
=> 50 
irb(main):038:0>` 

是的,我王建宇,山西高等學校喜歡紅寶石......異更好的解決方案。

1

在Ruby中,你可以通過兩種方式

  1. 實現這一目標使用attr_ *方法

讓我解釋上面的方法,供您手動定義getter和setter方法

  • 手動定義吸氣器和吸氣器

    class Human 
        def sex=(gender) 
        @sex = gender 
        end 
    
        def sex 
        @sex 
        end 
    end 
    
    //from outside class 
    human = Human.new 
    // getter method call 
    puts human.sex 
    // setter method call to explicitly set the instance variable 
    human.sex = 'female' 
    
    puts human.sex 
    // now this prints female which is set 
    

    使用attr_ *方法

    class Human 
        attr_accessor :sex 
    end 
    
    //from outside 
    
    human = Human.new 
    // getter method call 
    puts human.sex 
    // setter method call to explicitly set the instance variable 
    human.sex = 'female' 
    
    puts human.sex 
    // now this prints female which is set 
    

    attr_accessor內部爲您創建setter和getter方法,如果你只想要設定裝置,你可以只使用attr_writer,如果你想只吸氣劑可以使用attr_reader。

    我希望我回答你的問題