コンテナ
コンテナ
コンテナとは複数のオブジェクトへのリファレンスを保持するオブジェクト。
配列クラスArray、ハッシュクラスHashなどがある。
ここではArticleクラスを管理するBBSを作る。
def initialize
@list = Array.new()
end
end
add(追加)メソッド、delete(削除)メソッド、[](参照)演算子などが必要。
[]メソッドで取得した変数はBBS内のArticleを参照しているので、update(更新)メソッドは必要ない。
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メソッドを作る。
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にはこれより自然な方法があり「配列に探させる」のである。
def id( id )
return @list.find{ |article| article.id == id }
end
end
print list.id( 1 ) ⇒ 1 変更 たすく ^o^
print list.id( 7 ) ⇒ 7 無題 たすく 本文
このfindがイテレータを使ったメソッドで、{ 式 }もしくはdo 式 end形式のコードブロックを引数のあとに渡している。
イテレータはとても面白い重要な便利な機能なので次で詳しく見てみる。