Hitsuji_monのブログ~ 村上春樹のあれ ~

文学好きな組み込み系エンジニア

【#100DaysOfCode】7日目 「作りながら学ぶRuby入門」〜コレクション〜

今日はあまりできなかった。
まあ早寝の方が大事〜〜。ということで

Day 7

・「作りながら学ぶRuby入門」 第10章 コレクション

・複数冊の蔵書データを、クラスを維持して格納したい


コレクション: 複数のクラスのインスタンスを格納したもの

|クラスを定義しておく|
-- |各蔵書ごとにハッシュ値を決める |
-- |各ハッシュ値において定義したクラス(型)を使って蔵書データを登録|

以下、複数冊の蔵書データを格納したコレクション のコード

# 「作りながら学ぶRuby入門」第10章
# 複数冊の蔵書を格納できるコレクションを作成
## 蔵書データを扱うBookInfoクラス を値とするハッシュを作成すれば良い

require 'date'

# 蔵書1冊分の蔵書データのクラスを作る
class BookInfo
    def initialize( title, author, pages, publish_date )
        @title = title
        @author = author
        @pages = pages
        @publish_date = publish_date
    end

    # 最初に検討する属性に対するアクセサを提供する
    attr_accessor :title, :author, :pages, :publish_date
    
    # BookInfoクラスのインスタンスの文字列を返す
    def to_s
        "#{@title}, #{@author}, #{@pages}, #{publish_date}"
    end
    
    # 蔵書データを書式をつけて出力する操作を追加する
    def toFormattedString( sep = "\n" )
        "書籍名: #{@title}#{sep}著者名: #{@author}#{sep}ページ数: #{@pages}ページ#{sep}
        出版日: #{publish_date}#{sep}"
    end
end

# 複数冊の蔵書データを登録する
book_infos = Hash.new
book_infos["Yamada2005"] = BookInfo.new(
    "実践アジャイル ソフトウェア開発とプロジェクト管理",
    "山田 正樹",
    248,
    Date.new( 2005, 1, 25)
)

book_infos["Ooba2006"] = BookInfo.new(
    "入門LEGO MINDSTORM NXT レゴブロックで作る動くロボット",
    "大庭 慎一郎",
    164,
    Date.new( 2006, 12, 23 )
)

book_infos["Haruki2019"] = BookInfo.new(
    "騎士団長殺し 第1部 顕れるイデア編(上) クッソ面白い",
    "村上 春樹",
    "不明",
    Date.new( 2019, 3, 1)
)

# 登録した蔵書データを文字列表現で1冊ずつ出力する
## valueがBookInfoクラスのインスタンスを担っていることに注意
book_infos.each { |key, value|
    puts "#{key}: #{value.to_s}"
}

# 蔵書データを検索する
puts("蔵書データの検索結果")
puts book_infos.include? ("Yamada2005")
puts book_infos.include? ("Ooba0000")
puts book_infos.include? ("Haruki1984")
puts

## ハッシュから検索した蔵書データを取り出す
puts book_infos["Yamada2005"].title

book_info_var = book_infos["Haruki2019"]
puts book_info_var.title
puts book_info_var.author
puts book_info_var.pages
puts book_info_var.publish_date