Ruby/Railsでハッシュからキーを削除して残りのハッシュを取得するにはどうすればいいですか? 質問する

Ruby/Railsでハッシュからキーを削除して残りのハッシュを取得するにはどうすればいいですか? 質問する

ハッシュに新しいペアを追加するには、次のようにします。

{:a => 1, :b => 2}.merge!({:c => 3})   #=> {:a => 1, :b => 2, :c => 3}

ハッシュからキーを削除する同様の方法はありますか?

これは機能します:

{:a => 1, :b => 2}.reject! { |k| k == :a }   #=> {:b => 2}

しかし、次のようなものを期待します:

{:a => 1, :b => 2}.delete!(:a)   #=> {:b => 2}

返される値が残りのハッシュになることが重要なので、次のようなことができます。

foo(my_hash.reject! { |k| k == my_key })

一行で。

ベストアンサー1

ハッシュからキー/値のペアを削除する方法を知りたいだけの方は、以下を使用できます。
hash.delete(key)

まったく別のことについての長文を読むためにここに来た皆さんは、この回答の残りを読んでください。

Railsにはexcept/except!メソッドがあるこれらのキーを削除したハッシュを返します。すでに Rails を使用している場合は、独自のバージョンを作成しても意味がありません。

class Hash
  # Returns a hash that includes everything but the given keys.
  #   hash = { a: true, b: false, c: nil}
  #   hash.except(:c) # => { a: true, b: false}
  #   hash # => { a: true, b: false, c: nil}
  #
  # This is useful for limiting a set of parameters to everything but a few known toggles:
  #   @person.update(params[:person].except(:admin))
  def except(*keys)
    dup.except!(*keys)
  end

  # Replaces the hash without the given keys.
  #   hash = { a: true, b: false, c: nil}
  #   hash.except!(:c) # => { a: true, b: false}
  #   hash # => { a: true, b: false }
  def except!(*keys)
    keys.each { |key| delete(key) }
    self
  end
end

おすすめ記事