たとえば、一部の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の順番もそれに従って変化する。