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.speakSaída:
Rex says Woof
Bella says WoofOs 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.reportSaída:
count is 2As 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
endSaída:
Rex
undefined method `age' for an instance of DogUma 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_variablesSaída:
nil
[:@on]Desafio
FácilComplete 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
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online