たとえば、一部のattributeだけを突っ込んだArrayを作りたい場合
result = [
user.first_name,
user.last_name,
user.birthday
]
こんなかんじに書かず、Hash#sliceを書くと少しシンプル?に
result = user.slice(*%w(first_name last_name birthday)).values
こう書ける
指摘+αで少し調べた。(詳しくはコメ欄)
- 実はsliceに渡すのはString(%w)じゃなくてSymbol(%i)じゃなくてOK
result = user.slice(*%i(first_name last_name birthday)).values
- 手元で適当に試したところ、元のものから6%ほど高速化
- というかsliceしてvaluesするのなんかよりmapしてsendしたほうが早い
result = %i(first_name last_name birthday).map{|m| user.send m}
- これまた手元で適当に試したところ、元のものから84.5%ほど高速化
うーん。map
使うのはなんとなく主語にあたるuser
がうしろに行きすぎて読みづらいんだけどこの速度差なら許容できる程度の誤差だな・・・
slice
は内部でObject#public_send
を使っているので、send
で使えるものならなんでも(attributesに限らずメソッドでも)同様に処理することが出来る。
おそらくRubyのHashがOrderedHashになったからだと思うけれど、sliceに渡すキーの順番を変えると、valuesのArrayの順番もそれに従って変化する。