コンテナ

コンテナ

コンテナとは複数のオブジェクトへのリファレンスを保持するオブジェクト。
配列クラスArray、ハッシュクラスHashなどがある。

ここではArticleクラスを管理するBBSを作る。

class BBS
    def initialize
        @list = Array.new()
    end
end

add(追加)メソッド、delete(削除)メソッド、[](参照)演算子などが必要。
[]メソッドで取得した変数はBBS内のArticleを参照しているので、update(更新)メソッドは必要ない。

class BBS
    def to_s
        @list.to_s
    end
    def add( article )
        if @list.include?( article )
            raise "Error"
        end
        @list.push( article )
        self
    end
    def delete( article )
        @list.delete( article )
        self
    end
    def [] ( index )
        if index.kind_of?( Integer )
            @list[index]
        else
            nil
        end
    end
end
list = BBS.new()
list.add( Article.new( nil, "無題", "たすく", "本文" ) )
article = Article.new( nil, "変更", "たすく", "本文" )
list.add( article )
list.add( Article.new( nil, "無題", "たすく", "本文" ) )
list.add( Article.new( 5, "無題", "たすく", "本文" ) )
list.add( Article.new( 6, "無題", "たすく", "本文" ) )
list.add( Article.new( 7, "無題", "たすく", "本文" ) )
list.add( Article.new( 10, "無題", "たすく", "本文" ) )
print list ⇒ 0 無題 たすく 本文1 変更 たすく 本文2 無題 たすく 本文5 無題 たすく 本文6 無題 たすく 本文7 無題 たすく 本文10 無題 たすく 本文
list.delete( list[0] )
print list ⇒ 1 変更 たすく 本文2 無題 たすく 本文5 無題 たすく 本文6 無題 たすく 本文7 無題 たすく 本文10 無題 たすく 本文
article = list[0]
article.comment = "^o^"
print list ⇒ 1 変更 たすく ^o^2 無題 たすく 本文5 無題 たすく 本文6 無題 たすく 本文7 無題 たすく 本文10 無題 たすく 本文

IDでも検索したいのでidメソッドを作る。

class BBS
    def id( id )
        for i in 0...@list.length
            if @list[i].id == id
                return @list[i]
            end
        end
        nil
    end
end
print list ⇒ 1 変更 たすく ^o^2 無題 たすく 本文5 無題 たすく 本文6 無題 たすく 本文7 無題 たすく 本文10 無題 たすく 本文
print list.id( 1 ) ⇒ 1 変更 たすく ^o^
print list.id( 7 ) ⇒ 7 無題 たすく 本文

これはおなじみの方法だが、Rubyにはこれより自然な方法があり「配列に探させる」のである。

class BBS
    def id( id )
        return @list.find{ |article| article.id == id }
    end
end
print list.id( 1 ) ⇒ 1 変更 たすく ^o^
print list.id( 7 ) ⇒ 7 無題 たすく 本文

このfindがイテレータを使ったメソッドで、{ 式 }もしくはdoend形式のコードブロックを引数のあとに渡している。
イテレータはとても面白い重要な便利な機能なので次で詳しく見てみる。

スポンサード リンク

トラックバック

トラックバックURL
https://linux-life.net/tb/program/ruby/doc/chapter05/
Linux Life 〜 No linux, No life 〜
プログラミング > Ruby > Ruby入門 > コンテナ