从外部访问一个类的实例变量

问题描述:

我明白(我认为)Ruby中一个类的类变量和实例变量之间的区别。从外部访问一个类的实例变量

我在想如何从外部那个类访问类的实例变量。

从内部(即在类方法而不是实例方法中),它可以直接访问,但是从外部来看,有没有办法做到这一点MyClass.class.[@$#]variablename

我没有任何具体的理由这样做,只是学习Ruby,并想知道是否有可能。

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

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>` 

是的,我王建宇,山西高等学校喜欢红宝石......异更好的解决方案。

在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。

    我希望我回答你的问题