Menu
Coddy logo textTech

Okuyucular ve Yazıcılar

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 7 / 57.

Her örnek değişken için bir okuyucu yöntemi yazmak tekrarlayıcıdır. Sınıf gövdesindeki attr_reader :title, @title değerini döndüren title yöntemini oluşturur. Tek bir satırda birden fazla ad listelenebilir:

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

Çıktı:

Dune
412

attr_writer :title, @title içinde aldığı argümanı saklayan title= metoduyla bir setter oluşturur. Ruby, bunu atama söz dizimiyle çağırmanıza olanak tanır: 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

Çıktı:

Dune Messiah

attr_accessor hem okuyucuyu hem de ayarlayıcıyı oluşturur. Her ikisi de mevcut olduğunda, += gibi kısa gösterimler de çalışır; çünkü player.score += 5, player.score = player.score + 5 anlamına gelir:

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}"

Çıktı:

Ada L.: 8

Mümkün olduğunca azını dışa açın. Dış kodun okuyabileceği ancak değiştiremeyeceği değerler için attr_reader kullanın ve yalnızca değeri dışarıdan değiştirmenin tasarımın bir parçası olduğu durumlarda bir yazıcı ekleyin. Yalnızca okuyucu olan bir niteliğe atama yapmak NoMethodError hatası verir:

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

Çıktı:

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

Görev

Kolay

Book sınıfını tamamla. Kod dışından title, author ve pages okunabilir; başlangıçta 0 olan pages_read okunabilir ve değiştirilebilir. progress, yüzde aşağı yuvarlanmış olarak Dune: 120/412 (29%) döndürür.

Sağlanan kod, ilk üç girdi satırından (başlık, yazar, sayfa sayısı) bir kitap oluşturur. Sonraki her satır, okuyucunun okuduğu sayfa sayısını belirtir; kod, her birini book.pages_read += n ile ekler. Son olarak Dune by Frank Herbert ve ilerleme bilgisi yazdırılır.

Kodun book.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'book'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi