RailsでのHash#sliceとHash#slice!の違い

Hash#slice!がHash#sliceを破壊的にしただけのメソッドだと勘違いしてしばらく悩んだ。

h = { a:1, b:2, c:3, d:4 }
h.slice(:c, :d) #=> {:c=>3, :d=>4}
h #=> {:a=>1, :b=>2, :c=>3, :d=>4}

h.slice!(:c, :d) #=> {:a=>1, :b=>2}
h #=> {:c=>3, :d=>4}
  • slice : 引数で指定したキーだけを含んだハッシュを返す。非破壊的。
  • slice! : レシーバのハッシュについて引数で指定したキー以外を削除し、削除した部分を返す。