Aquí hay un código:
class Person
def initialize(age)
@age = age
end
def age
@age
end
def age_difference_with(other_person)
(self.age - other_person.age).abs
end
protected :age
end
Lo que quiero saber es la diferencia entre usar @age
y self.age
en age_difference_with
método.
ruby
self
instance-variables
sarunw
fuente
fuente
La diferencia es que está aislando el uso del método de la implementación del mismo. Si la implementación de la propiedad cambiara, por ejemplo, mantener la fecha de nacimiento y luego calcular la edad en función de la diferencia de tiempo entre ahora y la fecha de nacimiento, entonces el código dependiendo del método no necesita cambiar. Si usaba la propiedad directamente, entonces el cambio necesitaría propagarse a otras áreas del código. En este sentido, usar la propiedad directamente es más frágil que usar la interfaz proporcionada por la clase.
fuente
Tenga en cuenta cuando herede una clase de la
Struct.new
cual es una forma ordenada de generar un inicializador ( ¿Cómo generar un inicializador en Ruby? )volverá
Sin embargo, cuando elimine el inicializador, volverá
Con la definición de clase
Debes proporcionar el constructor.
volverá
fuente
La primera respuesta es completamente correcta, pero como un novato relativo no me quedó claro de inmediato lo que implicaba (¿enviarse mensajes a uno mismo? Uh huh ...). Creo que un breve ejemplo ayudará:
fuente
No hay ninguna diferencia Sospecho que se hizo solo por el valor documental de verse
self.age
yother_person.age
cerca el uno del otro.Supongo que el uso permite que se escriba un captador real en el futuro, lo que podría hacer algo más complejo que simplemente devolver una variable de instancia, y en ese caso el método no necesitaría cambiar.
Pero es una abstracción poco probable de la que preocuparse, después de todo, si la implementación del objeto cambió, es razonable cambiar otros métodos, en algún momento una referencia simple dentro del objeto en sí es perfectamente razonable.
En cualquier caso, la abstracción de la
age
propiedad todavía no explica el uso explícito deself
, ya que simplementeage
también habría invocado el descriptor de acceso.fuente
@age: definitivamente es la edad variable de la instancia
self.age: se refiere a la antigüedad de la propiedad de instancia.
fuente