【问题标题】:Accessing a Class' instance variable from outside从外部访问类的实例变量
【发布时间】:2011-05-11 07:31:26
【问题描述】:

我理解(我认为)Ruby 中类变量和类的实例变量之间的区别。

我想知道如何从某个类的 OUTSIDE 访问该类的实例变量。

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

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

【问题讨论】:

    标签: ruby variables instance-variables class-variables


    【解决方案1】:
    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
      

      在类实例变量 b in 的实例上定义 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
      

      现在可以通过所有者类及其实例访问类实例变量 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​​...这是一个更好的解决方案。

      【讨论】:

        【解决方案3】:

        在 ruby​​ 中,您可以通过两种方式实现这一目标

        1. 手动定义 getter 和 setter
        2. 使用 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 方法,如果你只想要 setter,你可以使用 attr_writer,如果你只想要 getter,你可以使用 attr_reader。

        希望我回答了你的问题

        【讨论】:

          猜你喜欢
          • 2012-08-20
          • 1970-01-01
          • 2013-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-03
          • 1970-01-01
          相关资源
          最近更新 更多