Lectores y escritores
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 7 de 57.
Escribir un método lector para cada variable de instancia es repetitivo. attr_reader :title en el cuerpo de la clase genera el método title, que devuelve @title. Una línea puede enumerar varios nombres:
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.pagesSalida:
Dune
412attr_writer :title genera un setter, el método title=, que almacena su argumento en @title. Ruby permite llamarlo con sintaxis de asignación, 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.titleSalida:
Dune Messiahattr_accessor genera tanto el lector como el setter. Con ambos disponibles, también funciona la forma abreviada como +=, 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}"Salida:
Ada L.: 8Expón lo menos posible. Usa attr_reader para los valores que el código externo pueda leer, pero no cambiar, y añade un escritor solo cuando cambiar el valor desde fuera forme parte del diseño. Asignar un valor a un atributo de solo lectura genera un error 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.titleSalida:
undefined method `title=' for an instance of Book
DuneDesafío
FácilCompleta la clase Book. El código externo puede leer title, author y pages, y puede leer y cambiar pages_read, que comienza en 0. progress devuelve Dune: 120/412 (29%), con el porcentaje redondeado hacia abajo.
El código proporcionado crea un libro a partir de las tres primeras líneas de entrada (título, autor, páginas). Cada línea posterior es un número de páginas que el lector ha avanzado; el código suma cada una mediante book.pages_read += n. Finalmente, imprime Dune by Frank Herbert y el progreso.
Tu código va en book.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'book'
# Código de entrada/salida suministrado: déjalo tal 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 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
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online