tutorial - Intentando aprender/entender los métodos de Ruby setter y getter
ruby wikipedia (4)
La linea de codigo
puts man.noise=("Howdie!")
NO utiliza el método getter, por lo que no es necesario definir el método getter para que funcione. Esa línea solo usa el método setter. El valor de retorno del método setter es automáticamente igual a lo que esté en el lado derecho del signo igual, entonces "Howdie!" se pasa a puts
La linea de codigo
puts man.noise
SÍ usa el método getter, y no funcionaría si elimina el método getter.
Estoy aprendiendo a programar y decidí probar Ruby. Estoy seguro de que esta es una pregunta estúpida, pero el instructor está hablando de métodos setter y getter, y estoy confundido. Aquí está el ejemplo:
class Human
def noise=(noise)
@noise = noise
end
def noise
@noise
end
end
A partir de esto, la clase se crea una instancia, y puedo poner esto:
man = Human.new
man.noise=("Howdie!")
puts man.noise
¡Esto resulta en Howdie!
Ahora lo que me confunde es que el instructor dice que sin el método getter (el segundo de los dos métodos), no hay forma de interactuar con la variable de instancia @noise.
Pero cuando elimino el método getter, aún puedo acceder a @noise, ver ejemplo:
class Human
def noise=(noise)
@noise = noise
end
end
man = Human.new
puts man.noise=("Howdie!")
Esto funciona igual que cuando se usa el método getter.
Así que ahora estoy confundido. ¿Por qué es necesario el getter? ¿Qué quiere decir el instructor al no poder acceder a la variable de instancia sin él? ¿Es posible que esté usando una versión anterior de Ruby?
Gracias de antemano por tu ayuda.
Puede interactuar con esa variable de instancia desde otros métodos que pertenecen a esa instancia, incluso si no hay getter:
def noise=(noise)
@noise = noise
end
def last_noise
@noise
end
No es necesario que haya un getter definido con el mismo nombre que el método; los dos no están vinculados en absoluto. El getter es necesario para "obtener" el valor de la variable de instancia, pero solo en una sintaxis breve .
Lo que está sucediendo en tu ejemplo es que estás inicializando un nuevo objeto ( Human.new
), y luego usando un método ( noise=
, yes el nombre del método contiene el símbolo =
) que simplemente define una variable de instancia ( es decir, una variable solo para esa instancia), y finalmente recuperando esa variable de instancia con otra llamada a método.
Puede usar instance_variable_get
para obtener la variable de instancia sin definir ningún get:
man = Human.new
man.noise = "Howdie"
man.instance_variable_get("@noise")
Esto devolverá "Howdie", a pesar de que no hay ningún getter definido.
Y no, no creo que esté usando una versión anterior de Ruby.
Puede ser la atención para getters y setters porque otros lenguajes le permiten acceder directamente a las variables de clase. Pitón:
class k:
i = 100
print k.i # 100
k.i = 200
print k.i # 200
En contraste, Ruby mantiene todas sus variables completamente privadas para la clase y solo las expone a través de métodos de acceso.
En su ejemplo, si elimina el captador, puede interactuar con la variable (es decir, cambiarlo) a través del colocador, pero no puede recuperarlo (de forma regular) cuando lo necesite.
Seguramente ambos devuelven un valor, pero su comportamiento es diferente.
Digamos que ya hay un miembro @a
.
con getter, uno obtiene el valor actual de @a
, sin modificarlo.
con setter, uno modifica @a
, y obtiene su nuevo valor como valor de retorno.
cuando piensas en el comportamiento de setter, nota:
el valor antiguo de @a no se puede obtener con setter, y se sobreescribió.
lo que devolvió Setter, en realidad ya se conoce antes de invocar a setter.