ruby - Attr_accessor en variables de clase
attr_accessor ruby (5)
attr_accessor
no funciona en el siguiente código. El error dice " undefined method ''things'' for Parent:Class (NoMethodError)
":
class Parent
@@things = []
attr_accessor :things
end
Parent.things << :car
p Parent.things
Sin embargo, el siguiente código funciona
class Parent
@@things = []
def self.things
@@things
end
def things
@@things
end
end
Parent.things << :car
p Parent.things
Esta es probablemente la forma más simple.
class Parent
def self.things
@@things ||= []
end
end
Parent.things << :car
p Parent.things
Solo algunas aclaraciones: las variables de clase no serán accesibles usando attr_accessor
. Se trata de variables de instancia:
class SomeClass
class << self
attr_accessor :things
end
@things = []
end
porque en Ruby, la clase es una instancia de la clase "Clase" (Dios, me encanta decir eso) y attr_accessor
establece métodos de acceso para variables de instancia.
También tenga en cuenta que un método singleton es un método solo para un solo objeto. En Ruby, una clase también es un objeto, ¡así que también puede tener métodos únicos! Así que ten en cuenta cuándo podrías llamarlos.
Ejemplo:
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
Métodos Singleton de SomeClass
prueba
Métodos Singleton de test_obj
test_2
prueba_3
attr_accessor
define los métodos de acceso para una instancia. Si quieres accesadores autogenerados a nivel de clase, puedes usarlo en la metaclase
class Parent
@things = []
class << self
attr_accessor :things
end
end
Parent.things #=> []
Parent.things << :car
Parent.things #=> [:car]
pero tenga en cuenta que esto crea una variable de instancia de nivel de clase, no una variable de clase. Es probable que esto sea lo que quiere de todos modos, ya que las variables de clase se comportan de manera diferente a lo que podría esperar al tratar con herencia. Consulte " Variables de clase e instancia en Ruby ".
attr_accessor
genera attr_accessor
para variables de instancia . Las variables de clase en Ruby son algo muy diferente, y generalmente no son lo que quieres. Lo que probablemente quieras aquí es una variable de instancia de clase. Puede usar attr_accessor
con las variables de instancia de clase así:
class Something
class <<self
attr_accessor :things
end
end
Entonces puedes escribir Something.things = 12
y funcionará.