简体   繁体   English

从外部访问Class的实例变量

[英]Accessing a Class' instance variable from outside

I understand (I think) the difference between class variables and instance variables of a class in Ruby. 我理解(我认为)Ruby中类的类变量和实例变量之间的区别。

I'm wondering how one can access the instance variables of a class from OUTSIDE that class. 我想知道如何从OUTSIDE那个类访问类的实例变量。

From within (that is, in a class method instead of an instance method), it can be accessed directly, but from outside, is there a way to do MyClass.class.[@$#]variablename ? 从内部(即在类方法而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename

I don't have any specific reason for doing this, just learning Ruby and wondering if it is possible. 我没有任何具体的理由这样做,只是学习Ruby并想知道它是否可行。

class MyClass

    @my_class_instance_var = "foo"

    class << self
        attr_accessor :my_class_instance_var
    end

end

puts MyClass::my_class_instance_var

The foregoing yields: 上述产量:

>> foo

I believe that Arkku demonstrated how to access class variables (@@), not class instance variables (@) from outside the class. 我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。

I drew the foregoing from this essay: Seeing Metaclasses Clearly 我从这篇文章中得出了上述内容: 明确地看到元类

Ruby has Class, Class Object, and Instance. Ruby有Class,Class Object和Instance。

A Class variable belongs to a Class. Class变量属于Class。
A Class instance variable belongs to a Class Object Class实例变量属于Class对象

Class variable: 类变量:

Accessible within the class and its instances. 在类及其实例中可访问。
attr_accessor does not work on class variables. attr_accessor不适用于类变量。

Class instance variable: 类实例变量:

Accessible only through the Class. 只能通过Class访问。
attr_accessor works if you define it in the class and not in the class object as below. 如果你在类中定义它而不是在类对象中定义它,则attr_accessor可以工作。

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

Defining a getter and setter on the instances for the class instance variable b in: 在类实例变量b的实例上定义getter和setter:

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

Now the class instance variable b can be accessed via the owner Class and its instances. 现在可以通过所有者Class及其实例访问类实例变量b。
As a several days old ruby learner, this is the most I can do. 作为一个几天的红宝石学习者,这是我能做的最多。

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

Yes, I'm begining to dislike ruby...iso a better solution. 是的,我开始不喜欢红宝石......等一个更好的解决方案。

In ruby you can achieve this in 2 ways 在红宝石中,您可以通过两种方式实现这一目标

  1. manually defining getter and setters 手动定义getter和setter
  2. using attr_* methods 使用attr_ *方法

Let me elaborate the above ways for you, 让我为您详细说明上述方法,

Manually defining getter and setters 手动定义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

using attr_* methods 使用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 internally creates setter and getter methods for you, if you want only setter you can just use attr_writer and if you want only getter you can use attr_reader. attr_accessor在内部为您创建setter和getter方法,如果您只想使用setter,则可以使用attr_writer,如果只想获取getter,则可以使用attr_reader。

I hope, I answered your question 我希望,我回答了你的问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM