Menu
Coddy logo textTech

Variáveis de Instância

Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 3 de 57.

Uma variável de instância começa com @ e pertence a um objeto. Um valor armazenado em initialize permanece disponível para todos os métodos desse objeto, e cada instância tem sua própria cópia:

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

Saída:

Rex says Woof
Bella says Woof

Os métodos podem alterar variáveis de instância, portanto um objeto se lembra do que aconteceu com ele. Juntas, suas variáveis de instância formam o estado do 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

Saída:

count is 2

As variáveis de instância não podem ser acessadas de fora do objeto. O código externo só pode chamar métodos, portanto uma classe que deseja compartilhar um valor define um método que o retorna, um leitor:

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

Saída:

Rex
undefined method `age' for an instance of Dog

Uma variável de instância à qual nunca foi atribuído um valor é nil e não gera nenhum erro, portanto um nome digitado incorretamente lê silenciosamente uma variável diferente e vazia. instance_variables lista as variáveis que um objeto realmente possui:

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

Saída:

nil
[:@on]
challenge icon

Desafio

Fácil

Complete a classe Pet. initialize(name, species, age) armazena os três valores, birthday adiciona um ano à idade, e describe retorna uma frase: um animal de estimação chamado Rex, da espécie dog, com idade 3 resulta em Rex is a 3 year old dog.

O código fornecido cria um Pet a partir das três primeiras linhas de entrada (nome, espécie, idade), chama birthday tantas vezes quanto a quarta linha indicar e imprime describe.

Seu código deve estar em pet.rb. main.rb contém o código de entrada/saída fornecido e não pode ser editado.

Experimente você mesmo

require_relative 'pet'

# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de Ruby online