8

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

我想知道如何从该类的外部访问该类的实例变量。

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

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

4

3 回答 3

8
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 演示了如何从类外部访问类变量 (@@),而不是类实例变量 (@)。

我从这篇文章中得出了上述内容:清楚地看到元类

于 2012-03-30T18:02:09.633 回答
3

Ruby 有类、类对象和实例。

一个类变量属于一个类。
一个类实例变量属于一个类对象

类变量:

可在类及其实例中访问。
attr_accessor 不适用于类变量。

类实例变量:

只能通过类访问。
如果您在类中而不是在类对象中定义 attr_accessor ,则如下所示。

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

在类实例变量 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

现在可以通过所有者类及其实例访问类实例变量 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>`

是的,我开始不喜欢红宝石了……这是一个更好的解决方案。

于 2015-10-23T10:40:01.080 回答
-1

在红宝石中,您可以通过两种方式实现这一目标

  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。

我希望,我回答了你的问题

于 2017-02-06T08:02:06.460 回答