类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