Menu
Coddy logo textTech

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

Salida:

Rex says Woof
Bella says Woof

Los 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.report

Salida:

count is 2

Las 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
end

Salida:

Rex
undefined method `age' for an instance of Dog

Una 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_variables

Salida:

nil
[:@on]
challenge icon

Desafío

Fácil

Completa 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
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Ruby online