attr_accessor ruby

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á.