【问题标题】: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 中,您可以通过两种方式实现这一目标
- 手动定义 getter 和 setter
- 使用 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。
希望我回答了你的问题