Menu
CoddyTech

Pembaca dan Penulis

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 7 dari 57.

Menulis method reader untuk setiap variabel instance terasa berulang. attr_reader :title di dalam isi class menghasilkan method title, yang mengembalikan @title. Satu baris dapat mencantumkan beberapa nama:

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 menghasilkan sebuah setter, method title=, yang menyimpan argumennya ke dalam @title. Ruby memungkinkan kamu memanggilnya dengan sintaks penugasan, 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 menghasilkan reader dan setter. Dengan keduanya, bentuk singkat seperti += juga berfungsi, karena player.score += 5 berarti 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

Ungkapkan sesedikit mungkin. Gunakan attr_reader untuk nilai yang boleh dibaca oleh kode di luar, tetapi tidak boleh diubah, dan tambahkan writer hanya jika mengubah nilai dari luar merupakan bagian dari desain. Menetapkan nilai ke atribut yang hanya bisa dibaca akan memunculkan 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

Tantangan

Mudah

Lengkapi class Book. Kode di luar class dapat membaca title, author, dan pages, serta dapat membaca dan mengubah pages_read, yang dimulai dari 0. progress mengembalikan Dune: 120/412 (29%), dengan persentase dibulatkan ke bawah.

Code yang disediakan membuat sebuah buku dari tiga baris input pertama (judul, penulis, jumlah halaman). Setiap baris berikutnya berisi jumlah halaman yang telah dibaca pembaca; code menambahkan setiap jumlah dengan book.pages_read += n. Terakhir, code mencetak Dune by Frank Herbert dan progres.

Letakkan kodemu di book.rb. main.rb berisi code input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

require_relative 'book'

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online