Mix-inのサンプル
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
クラス内にモジュールをインクルードするMix-inのサンプルです。
Comparableモジュールと、Enumerableモジュールを取り込んで動作確認。
イテレータを定義する・まずは未定義のクラスの例で作った、プロフィールとプロフィールリストのクラスを拡張します。
スポンサーリンク
require "pp"
# 1人のプロフィールのクラス。名前、年齢、出身国
class Prof
# インスタンス同士を比較するために、
# Comparableモジュールをインクルード
include Comparable
# <=>を再定義。1.名前、2.国の順で比較する
def <=>(other)
t = @name.to_s <=> other.name.to_s # 名前を比較
return t if t != 0 # 違う名前ならそのまま返す
return @country <=> other.country # 国を比較した結果を返す
end
attr_accessor :name, :age, :country
def initialize(name, age, country=nil)
@name = name
@age = age
@country = country
end
end
# プロフィールのリストのクラス
class ProfList
def initialize()
@proflist = Array.new
end
# 新しい人を加える
def add(prof)
@proflist.push(prof)
end
# 人数を返す
def length
@proflist.length
end
# n番目の人を別の人に入れ替える
def []=(n, prof)
@proflist[n] = prof
end
# n番目の人を返す
def [](n)
@proflist[n]
end
# リストからプロフィールを削除
def delete(prof)
@proflist.delete(prof)
end
# Enumerableモジュールのmapやgrepのメソッドを
# インスタンスに使えるようにする
include Enumerable
# イテレータ定義
def each
@proflist.each{|prof|
yield(prof)
}
end
# イテレータ定義3。名前、年齢、出身国のイテレート。
def each_all
@proflist.each{|prof|
yield(prof.name, prof.age, prof.country)
}
end
end
# テストルーチン
proflist = ProfList.new
# プロフィールをいくつか作る
p1 = Prof.new("Tom William", 45, "America")
p2 = Prof.new("De Pedoro", 23, "Spain")
p3 = Prof.new("Naoko Yamada", 37, "Japan")
p4 = Prof.new("Naoko Yamada", 37, "America")
# プロフィールリストに人(プロフィール)を追加
proflist.add(p1)
proflist.add(p2)
proflist.add(p3)
proflist.add(p4)
# プロフィールを1人ずつ表示。
# ProfListクラスの独自定義イテレータ。
puts "--- 定義したeachイテレータを使用"
proflist.each{|prof|
puts "#{prof.name} - age:#{prof.age} country:#{prof.country}"
}
# プロフィールの配列を作る
ary = []
ary << p1 << p2 << p3 << p4
puts "プロフィールの配列確認"
pp ary
puts "--- 名前、国でソート"
ary.sort.each{|prof|
puts "#{prof.name} - age:#{prof.age} country:#{prof.country}"
}
puts "--- Enumerableモジュールをインクルードしているのでmapが使える"
names = proflist.map{|prof|
prof.name
}
p names
実行結果。
Comparableモジュールのメソッドは、「<=>」を使って定義されています。
また、Enumerableモジュールのメソッドは、「each」と使って定義されています。
--- 定義したeachイテレータを使用 Tom William - age:45 country:America De Pedoro - age:23 country:Spain Naoko Yamada - age:37 country:Japan Naoko Yamada - age:37 country:America プロフィールの配列確認 [#<Prof:0x29a093c @age=45, @country="America", @name="Tom William">, #<Prof:0x29a0900 @age=23, @country="Spain", @name="De Pedoro">, #<Prof:0x29a08c4 @age=37, @country="Japan", @name="Naoko Yamada">, #<Prof:0x29a0888 @age=37, @country="America", @name="Naoko Yamada">] --- 名前、国でソート De Pedoro - age:23 country:Spain Naoko Yamada - age:37 country:America Naoko Yamada - age:37 country:Japan Tom William - age:45 country:America --- Enumerableモジュールをインクルードしているのでmapが使える ["Tom William", "De Pedoro", "Naoko Yamada", "Naoko Yamada"]
スポンサーリンク
>> 次の記事 : モジュールMix-inのルール
- - 関連記事 -
- モジュールMix-inのルール
スポンサーリンク