ruby/サンプル/Ruby1.8 1.9 構造体のようなクラスを簡単に作るクラス「Struct」


サンプルソース

# Ruby1.8 1.9 構造体のようなクラスを簡単に作るクラス「Struct」
 
# 使い方1.構造体クラスを作成
# 例:名前、メールアドレス、年齢をメンバに持つ構造体クラス「Member」を作成
# 第一引数をクラス名、第二引数以降をメンバ名を表すシンボル(:~)を付けるとよいです
# クラス名は大文字から始まらないとエラーです
Member = Struct.new("Member", :name, :email, :age)
 
# 使い方2.構造体オブジェクトを作成
# パラメータ指定なしなら全てのメンバがnilになります
member1 = Member.new
 
# パラメータを与えると、メンバに設定されます
# パラメータが多すぎるとエラーです。少ないと足りない分はnilです
member2 = Member.new("HOGE", "hoge@example.com", 81)
member3 = Member["good", "good@example.com", 99]
 
# 使い方3.メンバへのアクセス
# 例1.~.メンバ名
member1.name = "HOGE"
member1.email = "hoge@example.com"
member1.age = 81
p member1.name # HOGE
 
# 例2.~[0] 構造体クラス作成時のパラメータ順にアクセスできます
p member1[0] # HOGE
p member1[1] # hoge@example.com
p member1[2] # 81
 
# 例3.~["メンバ名"] メンバ名を添字としてもアクセスできます。連想配列みたい
p member1["name"] # HOGE
 
# その他
# メンバの配列を取得
p member1.to_a # ["HOGE", "hoge@example.com", 81]
p member1.values # ["HOGE", "hoge@example.com", 81]
 
# 全メンバに繰り返しアクセス
member1.each { |obj|
  p obj # MOGE moge@example.com 11の順に出力
}
 
# メンバ名の配列を取得
p Member.members # name email age
 
# 構造体同士の比較
# 同じクラス、同じメンバならtrueになります
p member1 == member2 # true
p member1.eql?(member2) # true
 
a = Array.new
a << Member.new("333", "111@example.com", 11);
a << Member.new("222", "222@example.com", 21);
a << Member.new("111", "333@example.com", 11);
a << Member.new("444", "444@example.com", 41);
a << Member.new("555", "555@example.com", 11);
# 構造体配列のソート
# 参考
#  Rubyでオブジェクトを要素とする配列をソートする際の覚え。 - Dragonmasterの日記
#  http://d.hatena.ne.jp/kx8k-hgc/20071128/1196234187
 
# nameでソート(単項目ソート
b = a.sort{|aa, bb|
      aa.name <=> bb.name
    }
puts b
puts "---"
 
# age nameでソート(複数項目でソート
c = a.sort{|aa, bb|
  if aa.age == bb.age
    aa.name <=> bb.name
  else
    aa.age <=> bb.age
  end
  }
 
puts c
 
# Structはなかなか便利そう
# Rubyのソートが超カンタンで驚いた
 

  • サンプルと言うよりは単なるメモです
  • メンバ名を指定するだけで構造体を作れるとか面白い
  • 構造体配列のソートがとても簡単に作れるのもすごいねRuby
  • Dragonmasterさんのこの記事にも感謝「http://d.hatena.ne.jp/kx8k-hgc/20071128/1196234187

コメント

最終更新:2013年01月26日 15:59