Rubyistなら知っておくべき地味だけど便利なメソッド

備忘録兼、初心者向けのメソッド一覧。
余裕があればRails編とかも書こうかな。
これ忘れてるとか何事?とかいう突っ込みがあれば是非お願いします。
もうちょっとコードの具体例書きたかったけど、めんどくさくなってきたw

Array

Array#combination(n), Array#permutation(n)

配列のデータを元に組み合わせ(順列)を作ってくれます。
ブロックを渡さない場合はEnumeratorで組み合わせの各要素を列挙します。

Enumerator

Enumerator#with_index(offset = 0)

Enumeratorの各要素に合わせてindexを列挙してくれるEnumeratorを返す。
each_sliceやcombination等にメソッドチェインで繋げて使う。

Enumerator#with_object(obj)

with_indexと同様で引数で渡したオブジェクトを一緒に列挙してくれるEnumeratorを返す。
同じくメソッドチェインで使う。

Hash

Hash[*key_and_value]

キーと値のペアの配列からハッシュを生成する時に便利。
(8/15 追記)

alist = [[1,"a"], [2,"b"], [3,["c"]]]
p Hash[*alist.flatten(1)]  # => {1=>"a", 2=>"b", 3=>["c"]}

p Hash[alist]  # => from 1.9 {1=>"a", 2=>"b", 3=>["c"]}
Hash#default=(value)

ハッシュにデフォルト値を設定する時に使う。
要素が無い時はとりあえずtrue返して欲しいとかの時に。

Hash#reject

Hashでもrejectが使える。
key, valueのどっちも受け取るので両方の値で評価できる。

MatchData#captures

正規表現の部分マッチを配列化する。
Regexp.last_matchで取得して$1, $2を配列として処理するなど。
部分マッチをEnumerableに回したい時とか。

Object

Object#method(method_name)

メソッドを取得して、ブロックとして渡したりできる。
yuroyoroさんのブログでは関数を渡すっぽい形でブロックを処理する一連の記事があるので参考になります。
http://yuroyoro.hatenablog.com/entry/2012/08/08/201720

Object#instance_eval, Object#instance_exec

Procオブジェクトと組み合わせれば、コンテキストを自在に操作できる。
先にprocを構築しておいて後から任意のコンテキストで評価するような時に良く使う。

Numeric

Numeric#step(limit, step=1)

任意の数刻みでループさせたい時に。
Enumerator化して、with_objectと組み合わせたりもできる。

String

String#self % args

sprintfをシンプルに書く方法。

p "i = %d" % 10       # => "i = 10"
String#center(width, padding = ' '), String#ljust(width, padding = ' '), String#rjust(width, padding = ' ')

文字列を中央(左右)に揃える。paddignで埋める文字列を指定できる。
ログ出力の区切り等に。

Enumerable

Enumerable#collect (Enumerable#map)

配列の各要素を変換した新しい配列が欲しい時は、eachよりこっちを使おう。

Enumerable#select (Enumerable#find_all)

配列をフィルターする時に使うことが多い。
mapしてselectするとか、selectしてからmapするなど、
メソッドチェインで配列を処理するのが気持ちいい。

Enumerable#cycle(n)

今の集合を繰り返す。ブロックを渡すかEnumerator。
nを省略すると無限ループが出来る。
#zipと組み合わせたり。

Enumerable#chunk

列挙できるものをブロックで評価された条件を元に区切って分割する。
余りに色々できるので、マニュアルを読まないと良く分からない。
ソート済みの物を分類してカウントしたり、テキストを空行ごとに段落分けしたり等。

Enumerable#flat_map

mapの中で配列を返すと二重配列になるようなものを結合して返してくれる。
後からflattenとかやらなくていいので、読みやすい。

Enumerable#take(n), Enumerable#take_while {|elem| }

配列から最大n個取りたいという時。
足りなければある分取ってくるし、副作用が無いので気楽に使える。
sort_byしてtake(n)で上位n個を取得するとか。

Enumerable#each_slice(n)

n個ずつブロックに渡す。
足りない時にはあるだけを渡す。
入力を2行ずつ処理したいとか、配列を3つずつの二重配列に変換したいとか。

[1,2,3,4,5,6,7,8].each_slice(3).to_a   # => [[1, 2, 3], [4, 5, 6], [7, 8]]
Enumerable#group_by

ブロックを評価した結果をキーとして、グルーピングされた要素を配列として持つハッシュを返す。
なんか分類したいなと思った時は大体使える。

Enumerable#all?, any? none?

eachで集合の検証をせずに、この辺のメソッドを使えばもっと見易く書ける。


(8/15 追記)

Method

Method.source_location

そのオブジェクトが示すメソッドが定義されているソースコードのファイル名と行数を配列で返す。
このメソッドどこにあるんだろうって時にサクっと調べられる。
(Thanks! id:sora_h)

User.method(:where).source_location
# => ["/home/joker/railsapp/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.6/lib/active_record/querying.rb", 8]