Menu
Coddy logo textTech

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

Output:

Dune
412

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

Output:

Dune Messiah

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

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

Output:

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

Sfida

Facile

Completa 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Ruby online