Enumerable モジュール,および Array, Hash で共通して利用できる 有用なメソッドを紹介する。 ArrayクラスはEnumerableモジュールをインクルードしているので 以下のメソッドは,Array に対して利用できる。 また,Hash に対してはブロック変数を2つ与えれば キーと値のペアを伴った繰り返しとして利用できる。
次講で説明するファイルやディレクトリの操作では複数のパス名が 配列の形で渡される。それらの中の各要素から特定の条件に合うものを選別したり, 処理を施したりするときにこれらのメソッドを効果的に適用できれば プログラムソースを飛躍的に短くできる。
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
を返す。Hash
の場合は最初にブロックで真を返したキーと値のペアを要素数 2
の配列にして返す。
select
各要素に対してブロックを評価し,真を返したときの要素 すべてを含む配列を返す。配列の中から,特定の条件に 適うものを抜き出すときに有用。
以下の例は4つの単語を含む配列から, 単語の長さが4のものを集めた配列を得ている。
user = %w,taro hanako jiro ichiro yayoi,
user.select {|i| i.length == 4}
=> ["taro", "jiro"]
delete
指定した値と等しい要素を削除し,削除した値を返す。
以下の例は4つの単語を含む配列から,"ichiro"
を削除したものである。
user = %w,taro hanako jiro ichiro yayoi, => ["taro", "hanako", "jiro", "ichiro", "yayoi"] user.delete("taro") => "taro" user => ["hanako", "jiro", "ichiro", "yayoi"]
delete_if
,
reject
ブロックを指定し,そのブロックが真を返したときの 要素をすべて削除し,削除した後の配列を返す。 以下の例は4つの単語を含む配列から, 単語の長さが4のものを削除した配列を得ている。
user = %w,taro hanako jiro ichiro yayoi, => ["taro", "hanako", "jiro", "ichiro", "yayoi"] user.delete_if {|i| i.length == 4} => ["hanako", "ichiro", "yayoi"]
grep
grep
は,
grep(pattern) grep(pattern) {|item| ...}
の書式で用い,各要素と pattern を ===
で比較した結果が真を返す要素すべてを含む配列を返す。ある
ファイルから特定のパターンを含む行を抽出することが
grep
コマンド並に手軽に実現できる。
grep
コマンドにパターンとファイル名を渡して
該当行を出力するのとほぼ同じ挙動は
#!/usr/bin/env ruby 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]}