programing

해시에서 키를 제거하고 Ruby/Rails에서 나머지 해시를 가져오는 방법은 무엇입니까?

elecom 2023. 7. 12. 22:15
반응형

해시에서 키를 제거하고 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 })

일렬로

해시에서 키/값 쌍을 삭제하는 방법을 알고 싶으시면 다음을 사용할 수 있습니다.
hash.delete(key)

완전히 다른 것에 대한 텍스트 벽을 읽기 위해 여기에 온 나머지 분들은 이 답변의 나머지 부분을 읽을 수 있습니다.

레일즈에는 해당 키가 제거된 해시를 반환하는 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

그냥 사용하지 않는 이유:

hash.delete(key)

hash이제 당신이 찾고 있는 "스캐너 해시"입니다.

하나의 라이너 플레인 루비는 루비 > 1.9.x에서만 작동합니다.

1.9.3p0 :002 > h = {:a => 1, :b => 2}
 => {:a=>1, :b=>2} 
1.9.3p0 :003 > h.tap { |hs| hs.delete(:a) }
 => {:b=>2} 

Tap 메서드는 항상 호출된 개체를 반환합니다...

외에 필요한 , 이 필요한 것입니다.active_support/core_ext/hash Rails함) 다음 중 할 수 (Rails 애플자로필요함으)

➜  ~  irb
1.9.3p125 :001 > require 'active_support/core_ext/hash' => true 
1.9.3p125 :002 > h = {:a => 1, :b => 2, :c => 3}
 => {:a=>1, :b=>2, :c=>3} 
1.9.3p125 :003 > h.except(:a)
 => {:b=>2, :c=>3} 
1.9.3p125 :004 > h.slice(:a)
 => {:a=>1} 

예외는 블랙리스트 접근 방식을 사용하므로 인수로 나열된 모든 키를 제거하는 반면 슬라이스는 화이트리스트 접근 방식을 사용하므로 인수로 나열되지 않은 모든 키를 제거합니다.그 방법들의 뱅 버전도 존재합니다.except!그리고.slice! 둘 다 합니다.) 지정된 해시를 수정하지만 반환 값이 서로 다릅니다. 둘 다 해시를 반환합니다.은 제된키 다니나타냅를의 .slice!▁the에 되어 있는 키.except!:

1.9.3p125 :011 > {:a => 1, :b => 2, :c => 3}.except!(:a)
 => {:b=>2, :c=>3} 
1.9.3p125 :012 > {:a => 1, :b => 2, :c => 3}.slice!(:a)
 => {:b=>2, :c=>3} 

해시에서 키를 제거하고 Ruby에서 나머지 해시를 가져오는 방법은 여러 가지가 있습니다.

  1. .slice=> 선택한 키를 반환하고 원래 해시에서 삭제하지 않습니다.사용하다slice! 키를영으로제면단려사다니합용순을거하적구를 합니다.slice.

    2.2.2 :074 > hash = {"one"=>1, "two"=>2, "three"=>3}
     => {"one"=>1, "two"=>2, "three"=>3} 
    2.2.2 :075 > hash.slice("one","two")
     => {"one"=>1, "two"=>2} 
    2.2.2 :076 > hash
     => {"one"=>1, "two"=>2, "three"=>3} 
    
  2. .delete=> 선택한 키를 원래 해시에서 삭제합니다(하나의 키만 허용하고 둘 이상은 허용할 수 없음).

    2.2.2 :094 > hash = {"one"=>1, "two"=>2, "three"=>3}
     => {"one"=>1, "two"=>2, "three"=>3} 
    2.2.2 :095 > hash.delete("one")
     => 1 
    2.2.2 :096 > hash
     => {"two"=>2, "three"=>3} 
    
  3. .except=> 나머지 키는 반환되지만 원래 해시에서 삭제되지는 않습니다.사용하다except! 키를영으로제면단려사다니합용순을거하적구를 합니다.except.

    2.2.2 :097 > hash = {"one"=>1, "two"=>2, "three"=>3}
     => {"one"=>1, "two"=>2, "three"=>3} 
    2.2.2 :098 > hash.except("one","two")
     => {"three"=>3} 
    2.2.2 :099 > hash
     => {"one"=>1, "two"=>2, "three"=>3}         
    
  4. .delete_if=> 값을 기준으로 키를 제거해야 하는 경우.그러면 원래 해시에서 일치하는 키가 분명히 제거됩니다.

    2.2.2 :115 > hash = {"one"=>1, "two"=>2, "three"=>3, "one_again"=>1}
     => {"one"=>1, "two"=>2, "three"=>3, "one_again"=>1} 
    2.2.2 :116 > value = 1
     => 1 
    2.2.2 :117 > hash.delete_if { |k,v| v == value }
     => {"two"=>2, "three"=>3} 
    2.2.2 :118 > hash
     => {"two"=>2, "three"=>3} 
    
  5. .compact=> 모두 제거하는 데 사용됩니다.nil해시 값입니다.사용하다compact!제거하려면nil값을 영구적으로 사용하지 않으면 단순을 사용합니다.compact.

    2.2.2 :119 > hash = {"one"=>1, "two"=>2, "three"=>3, "nothing"=>nil, "no_value"=>nil}
     => {"one"=>1, "two"=>2, "three"=>3, "nothing"=>nil, "no_value"=>nil} 
    2.2.2 :120 > hash.compact
     => {"one"=>1, "two"=>2, "three"=>3}
    

결과는 Ruby 2.2.2를 기반으로 합니다.

순수한 Ruby(Rails 없음)를 사용하고 싶다면 확장 메서드를 생성하지 않고(아마도 한두 곳에서만 필요하고 수많은 메소드로 네임스페이스를 오염시키고 싶지 않을 것이다) 해시를 제자리에서 편집하지 않을 경우(즉, 저와 같은 기능성 프로그래밍의 팬인 경우) 다음을 '선택'할 수 있습니다.

>> x = {:a => 1, :b => 2, :c => 3}
=> {:a=>1, :b=>2, :c=>3}
>> x.select{|x| x != :a}
=> {:b=>2, :c=>3}
>> x.select{|x| ![:a, :b].include?(x)}
=> {:c=>3}
>> x
=> {:a=>1, :b=>2, :c=>3}
#in lib/core_extensions.rb
class Hash
  #pass single or array of keys, which will be removed, returning the remaining hash
  def remove!(*keys)
    keys.each{|key| self.delete(key) }
    self
  end

  #non-destructive version
  def remove(*keys)
    self.dup.remove!(*keys)
  end
end

#in config/initializers/app_environment.rb (or anywhere in config/initializers)
require 'core_extensions'

.remove는 해시 자체를 수정하는 동안 키가 제거된 해시의 복사본을 반환하도록 설정했습니다.이것은 루비 규약과 일치합니다.예, 콘솔에서

>> hash = {:a => 1, :b => 2}
=> {:b=>2, :a=>1}
>> hash.remove(:a)
=> {:b=>2}
>> hash
=> {:b=>2, :a=>1}
>> hash.remove!(:a)
=> {:b=>2}
>> hash
=> {:b=>2}
>> hash.remove!(:a, :b)
=> {}

해시 #exception(루비 3.0+)

Ruby 3.0부터 Hash#exception은 내장 방식입니다.

따라서 ActiveSupport를 사용하거나 원숭이 패치를 작성할 필요가 없습니다.

h = { a: 1, b: 2, c: 3 }
p h.except(:a) #=> {:b=>2, :c=>3}

출처:

사용할 수 있습니다.except!에서facets보석:

>> require 'facets' # or require 'facets/hash/except'
=> true
>> {:a => 1, :b => 2}.except(:a)
=> {:b=>2}

원래 해시는 변경되지 않습니다.

편집: Russel의 말처럼 패싯은 몇 가지 숨겨진 문제가 있으며 ActiveSupport와 완전히 호환되지 않습니다.반면에 ActiveSupport는 측면만큼 완벽하지 않습니다.결국, 저는 AS를 사용하고 당신의 코드에 엣지 케이스를 넣을 것입니다.

Ruby 2를 사용하는 경우 원숭이 패치나 불필요하게 큰 라이브러리를 포함하는 대신 개선된 기능을 사용할 수 있습니다.

module HashExtensions
  refine Hash do
    def except!(*candidates)
      candidates.each { |candidate| delete(candidate) }
      self
    end

    def except(*candidates)
      dup.remove!(candidates)
    end
  end
end

프로그램의 다른 부분에 영향을 주거나 큰 외부 라이브러리를 포함할 필요 없이 이 기능을 사용할 수 있습니다.

class FabulousCode
  using HashExtensions

  def incredible_stuff
    delightful_hash.except(:not_fabulous_key)
  end
end

순수한 루비로:

{:a => 1, :b => 2}.tap{|x| x.delete(:a)}   # => {:b=>2}

Ruby on Rails: 다중 해시삭제를 참조

hash.delete_if{ |k,| keys_to_delete.include? k }

삭제하면 해시의 삭제 쌍을 반환하는 것이 좋습니다.내가 하는 일은:

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

사용해 보십시오.except!방법.

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

이것은 한 줄로 된 방법이지만, 그다지 읽을 수 없습니다.대신 두 줄을 사용할 것을 권장합니다.

use_remaining_hash_for_something(Proc.new { hash.delete(:key); hash }.call)

해시에서 키를 삭제하는 여러 가지 방법.아래에서 원하는 방법을 사용할 수 있습니다.

hash = {a: 1, b: 2, c: 3}
hash.except!(:a) # Will remove *a* and return HASH
hash # Output :- {b: 2, c: 3}

hash = {a: 1, b: 2, c: 3}
hash.delete(:a) # will remove *a* and return 1 if *a* not present than return nil

많은 방법이 있습니다. 여기 해시의 루비 문서를 보실 수 있습니다.

감사해요.

이 방법도 사용할 수 있습니다.hash[hey] = nil

언급URL : https://stackoverflow.com/questions/6227600/how-to-remove-a-key-from-hash-and-get-the-remaining-hash-in-ruby-rails

반응형