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のルール
スポンサーリンク