1. ホーム
  2. ruby-on-rails

[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?

2022-03-16 17:08:46

質問

Hash I doに新しいペアを追加したい。

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

Hashからキーを削除する同様の方法はありますか?

これは有効です。

{: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行にまとめたものです。

解決方法は?

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