Menu
Coddy logo textTech

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

Saída:

Dune
412

attr_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.title

Saída:

Dune Messiah

attr_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.: 8

Exponha 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.title

Saída:

undefined method `title=' for an instance of Book
Dune
challenge icon

Desafio

Fácil

Complete 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
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