类variables的Attr_accessor

attr_accessor在下面的代码上不起作用。 错误说“ undefined method 'things' for Parent:Class (NoMethodError)

 class Parent @@things = [] attr_accessor :things end Parent.things << :car p Parent.things 

但是下面的代码工作

 class Parent @@things = [] def self.things @@things end def things @@things end end Parent.things << :car p Parent.things 

attr_accessor为实例定义访问器方法。 如果你想要类级自动生成访问器,你可以在元类上使用它

 class Parent @things = [] class << self attr_accessor :things end end Parent.things #=> [] Parent.things << :car Parent.things #=> [:car] 

但请注意,这将创build一个类级别的实例variables而不是一个类variables。 无论如何,这可能是你想要的,因为类variables的行为与你在处理w / inheritence时所期望的不同。 请参阅“ Ruby中的类和实例variables ”。

attr_accessor实例variables生成访问器。 Ruby中的类variables是一个非常不同的东西,它们通常不是你想要的。 你可能想要的是一个类实例variables。 你可以像这样使用attr_accessor类的实例variables:

 class Something class <<self attr_accessor :things end end 

那么你可以写Something.things = 12 ,它会工作。

只是澄清一下:类variables将无法使用attr_accessor访问。 这都是关于实例variables:

 class SomeClass class << self attr_accessor :things end @things = [] end 

因为在Ruby中,class是类“Class”的实例(上帝,我喜欢这么说), attr_accessor为实例variables设置访问器方法。

这可能是最简单的方法。

 class Parent def self.things @@things ||= [] end end Parent.things << :car p Parent.things 

另外请注意, 单例方法仅适用于单个对象。 在Ruby中,类也是一个对象,所以也可以有单例方法! 所以要注意什么时候可以打电话给他们。

例:

 class SomeClass class << self def test end end end test_obj = SomeClass.new def test_obj.test_2 end class << test_obj def test_3 end end puts "Singleton methods of SomeClass" puts SomeClass.singleton_methods puts '------------------------------------------' puts "Singleton methods of test_obj" puts test_obj.singleton_methods 

SomeClass的单​​例方法

testing


test_obj的单例方法

test_2

test_3