リーダーとライター
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 7/57。
インスタンス変数ごとにリーダーメソッドを書くのは繰り返しになります。クラス本体に記述した attr_reader :title は、@title を返すメソッド title を生成します。1行に複数の名前を指定できます。
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出力:
Dune
412attr_writer :title は、引数を @title に格納する セッター、メソッド title= を生成します。Ruby では代入構文 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出力:
Dune Messiahattr_accessorは読み取り用のメソッドとセッターの両方を生成します。両方が用意されているため、+=のような省略記法も使えます。これは、player.score += 5が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}"出力:
Ada L.: 8できるだけ公開するものを少なくしましょう。外部のコードから読み取ることはできても変更はできない値にはattr_readerを使い、外部から値を変更することが設計の一部である場合にのみ、writerを追加します。reader専用の属性に代入すると、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出力:
undefined method `title=' for an instance of Book
Duneチャレンジ
簡単Bookクラスを完成させてください。クラスの外部からtitle、author、pagesを読み取ることができ、最初は0のpages_readは読み取りと変更ができます。progressは、パーセンテージを切り捨てたDune: 120/412 (29%)を返します。
提供されたコードは、最初の3行の入力(タイトル、著者、ページ数)から本を作成します。その後の各行は読者が読み終えたページ数で、コードはそれぞれをbook.pages_read += nで加算します。最後にDune by Frank Herbertと進捗状況を出力します。
コードはbook.rbに記述します。main.rbには提供された入出力コードがあり、編集できません。
自分で試してみよう
require_relative 'book'
# 提供された入出力コード: そのままにしておいてください
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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ