Leitores e Gravadores
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 7 de 57.
Escrever um método leitor para cada variável de instância é repetitivo. attr_reader :title no corpo da classe gera o método title, que retorna @title. Uma linha pode listar vários nomes:
class Book
attr_reader :title, :pages
def initialize(title, pages)
@title = title
@pages = pages
end
end
book = Book.new("Dune", 412)
puts book.title
puts book.pagesSaída:
Dune
412attr_writer :title gera um setter, o método title=, que armazena seu argumento em @title. Ruby permite chamá-lo com a sintaxe de atribuição, book.title = "Emma":
class Book
attr_reader :title
attr_writer :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
book.title = "Dune Messiah"
puts book.titleSaída:
Dune Messiahattr_accessor gera tanto o leitor quanto o setter. Com ambos disponíveis, abreviações como += também funcionam, porque player.score += 5 significa player.score = player.score + 5:
class Player
attr_accessor :name, :score
def initialize(name)
@name = name
@score = 0
end
end
ada = Player.new("Ada")
ada.score += 5
ada.score += 3
ada.name = "Ada L."
puts "#{ada.name}: #{ada.score}"Saída:
Ada L.: 8Exponha o mínimo possível. Use attr_reader para valores que o código externo pode ler, mas não alterar, e adicione um escritor somente quando alterar o valor de fora fizer parte do projeto. Atribuir a um atributo somente de leitura gera NoMethodError:
class Book
attr_reader :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
begin
book.title = "Emma"
rescue NoMethodError => e
puts e.message
end
puts book.titleSaída:
undefined method `title=' for an instance of Book
DuneDesafio
FácilComplete a classe Book. O código externo pode ler title, author e pages, e pode ler e alterar pages_read, que começa em 0. progress retorna Dune: 120/412 (29%), com a porcentagem arredondada para baixo.
O código fornecido cria um livro a partir das três primeiras linhas de entrada (título, autor, páginas). Cada linha seguinte é um número de páginas que o leitor avançou; o código adiciona cada uma com book.pages_read += n. Por fim, ele imprime Dune by Frank Herbert e o progresso.
Seu código deve ficar em book.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'book'
# Código de entrada/saída fornecido: mantenha-o como está
input = []
while (line = gets)
input << line.chomp
end
book = Book.new(input[0], input[1], input[2].to_i)
input.drop(3).each { |n| book.pages_read += n.to_i }
puts "#{book.title} by #{book.author}"
puts book.progress
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