Accediendo a la variable creada usando attr_accessor

Estoy tratando de entender que attr_accessor me da acceso a. Por lo que entiendo, proporciona métodos getter y setter. Entonces attr_accessor :color creará algo como lo siguiente para mí

def color
  @color
end

def color=(value)
  @color = value
end

Lo que no entiendo es por qué en el siguiente código, ¿por qué no puedo usar color= en mi inicializador? (termina en blanco). ¿Por qué necesito usar @color= or self.color= ¿en lugar de? No debería color= ¿Sería una forma de llamar al método setter que acabo de crear para mí anteriormente?

class Bird
  attr_accessor :color
  def initialize(c="green")
    color = c  # this doesn't work
    # either one of the following DOES work
    # @color = c
    # self.color = c
  end
end

puts Bird.new.color  # prints nothing unless using @color or self.color

preguntado el 10 de mayo de 11 a las 13:05

1 Respuestas

Una expresión como color = "green" asigna "green" a una variable local, no es a un atributo. Establecedores de atributos Siempre hay necesita un receptor, incluso si el receptor es self.

contestado el 10 de mayo de 11 a las 17:05

una pregunta relacionada, es self.color el camino a seguir o @color? - Dty

@Dty, una muy buena pregunta. Yo diría que en la propia implementación de la clase, usando @color está bien. Sin embargo, en los módulos incluidos y en las clases secundarias, desaconsejaría el uso @color directamente (en lugar de usar color or self.color, self.color=). El uso de variables de instancia en clases derivadas o módulos incluidos viola la encapsulación, aunque Ruby se lo permitirá felizmente. - molf

Algo que descubrí recientemente es que debes usar self.color si tiene un método de establecimiento que desea ejecutar. Utilizando @self.color omitiría el método de establecimiento. - Dty

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.