Variables de instancia
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 3 de 57.
Una variable de instancia comienza con @ y pertenece a un objeto. Un valor almacenado en initialize permanece disponible para todos los métodos de ese objeto, y cada instancia tiene su propia copia:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speakSalida:
Rex says Woof
Bella says WoofLos métodos pueden cambiar las variables de instancia, por lo que un objeto recuerda lo que le ha sucedido. En conjunto, sus variables de instancia constituyen el estado del objeto:
class Counter
def initialize
@count = 0
end
def increment
@count += 1
end
def report
"count is #{@count}"
end
end
clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.reportSalida:
count is 2Las variables de instancia no se pueden alcanzar desde fuera del objeto. El código externo solo puede llamar a métodos, así que una clase que quiere compartir un valor define un método que lo devuelve, un lector:
class Dog
def initialize(name)
@name = name
end
def name
@name
end
end
rex = Dog.new("Rex")
puts rex.name
begin
rex.age
rescue NoMethodError => e
puts e.message
endSalida:
Rex
undefined method `age' for an instance of DogUna variable de instancia a la que nunca se le asignó un valor es nil y no genera ningún error, por lo que un nombre mal escrito lee silenciosamente una variable diferente y vacía. instance_variables enumera las variables que realmente tiene un objeto:
class Lamp
def initialize
@on = false
end
def status
@onn.inspect
end
end
lamp = Lamp.new
puts lamp.status
p lamp.instance_variablesSalida:
nil
[:@on]Desafío
FácilCompleta la clase Pet. initialize(name, species, age) almacena los tres valores, birthday añade un año a la edad y describe devuelve una oración: una mascota llamada Rex, de especie dog y con edad 3 da como resultado Rex is a 3 year old dog.
El código proporcionado crea un Pet a partir de las tres primeras líneas de entrada (nombre, especie, edad), llama a birthday tantas veces como indica la cuarta línea e imprime describe.
Tu código debe estar en pet.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'pet'
# Código de entrada/salida suministrado: déjalo como está
input = []
while (line = gets)
input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online