備忘録兼、初心者向けのメソッド一覧。
余裕があれば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返して欲しいとかの時に。
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 追記)