Enumerable の有用なメソッドを紹介する。 ArrayクラスはEnumerableモジュールをインクルードしているので 以下のメソッドは,Arrayに対して利用できる。
collect
各要素すべてに対してブロックを評価した値すべてを 含む配列を返す。
以下の例は配列中の文字列すべてに
@example.jp
を追加し,それらを含む配列を返す。
user = %w,taro hanako jiro ichiro yayoi,
user.collect do |u|
u+"@example.jp"
end
=> ["taro@example.jp", "hanako@example.jp", "jiro@example.jp",
"ichiro@example.jp", "yayoi@example.jp"]
find
先頭要素から順にブロックを評価し,真になった最初の値を返す。
見付からなければ nil
を返す。
select
各要素に対してブロックを評価し,真を返したときの要素 すべてを含む配列を返す。配列の中から,特定の条件に 適うものを抜き出すときに有用。
user = %w,taro hanako jiro ichiro yayoi,
user.select {|i| i.length == 4}
=> ["taro", "jiro"]
grep
grep
は,
grep(pattern) grep(pattern) {|item| ...}
の書式で用い,各要素と pattern を ===
で比較した結果が真を返す要素すべてを含む配列を返す。ある
ファイルから特定のパターンを含む行を抽出することが
grep
コマンド並に手軽に実現できる。
grep
コマンドにパターンとファイル名を渡して
該当行を出力するのとほぼ同じ挙動は
#!/usr/bin/env ruby # coding: euc-jp pattern = Regexp.new(ARGV.shift) # 第1引数はパターン print ARGF.readlines.grep(pattern)
で書ける。
sort_by
各要素そのものをソートするのでない場合(たとえば各要素が
さらに配列になっているような場合),sort
メソッドに
ソートブロックを指定する必要があるが,それは要素ごとの比較
のたびにブロックを評価するので効率が悪い。sort_by
は,あらかじめ比較要素の取り出しをまとめて行なってから
並べ換えを行なうので効率がよい。以下の2つは同じソート規準で
ソートする。
point = [ ["太郎", 50, 20], ["花子", 60, 80], ["二郎", 40, 50] ] # ソートその1(sortによるブロック) point.sort {|a, b| a[1]+a[2] <=> b[1]+b[2]} # ソートその2(sort_byによるブロック) point.sort_by {|a| a[1]+a[2]}