Metodi di lettura e scrittura
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 7 di 57.
Scrivere un metodo di lettura per ogni variabile di istanza è ripetitivo. attr_reader :title nel corpo della classe genera il metodo title, che restituisce @title. Una riga può elencare più nomi:
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.pagesOutput:
Dune
412attr_writer :title genera un setter, il metodo title=, che memorizza il suo argomento in @title. Ruby ti permette di chiamarlo con la sintassi di assegnazione, 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.titleOutput:
Dune Messiahattr_accessor genera sia il reader sia il setter. Con entrambi disponibili, funziona anche la forma abbreviata +=, perché 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}"Output:
Ada L.: 8Esponi il meno possibile. Usa attr_reader per i valori che il codice esterno può leggere ma non modificare, e aggiungi un writer solo quando modificare il valore dall'esterno fa parte del progetto. Assegnare un valore a un attributo disponibile solo in lettura genera 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.titleOutput:
undefined method `title=' for an instance of Book
DuneSfida
FacileCompleta la classe Book. Il codice esterno può leggere title, author e pages, e può leggere e modificare pages_read, che parte da 0. progress restituisce Dune: 120/412 (29%), con la percentuale arrotondata per difetto.
Il codice fornito crea un libro usando le prime tre righe di input (titolo, autore, pagine). Ogni riga successiva indica il numero di pagine lette; il codice le aggiunge una alla volta con book.pages_read += n. Infine stampa Dune by Frank Herbert e l'avanzamento.
Il tuo codice va inserito in book.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'book'
# Codice di input/output fornito: lascialo così com'è
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online