「ruby/サンプル/Ruby1.8 1.9 構造体のようなクラスを簡単に作るクラス「Struct」」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
* ruby/サンプル/Ruby1.8 1.9 構造体のようなクラスを簡単に作るクラス「Struct」
* サンプルソース
#highlight(ruby){{
# 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」
* コメント
#pcomment(reply)