[ruby] Ruby에서 <<로 해시에 키 / 값 쌍 추가

Ruby에서는 << :를 사용하여 기존 배열에 값을 추가 할 수 있습니다.

a = []
a << "foo"

하지만 기존 해시에 키 / 값 쌍을 추가 할 수도 있습니까?

h = {}
h << :key "bar"

나는 당신이 할 수 있다는 것을 압니다.

h[:key] = ""
h[:key] << "bar"

그러나 그것은 내가 원하는 것이 아닙니다.

감사.



답변

있습니다 merge!.

h = {}
h.merge!(key: "bar")
# => {:key=>"bar"}


답변

해시는 본질적으로 순서가 지정되지 않았기 때문에 추가 개념이 없습니다. 그러나 1.9 이후의 루비 해시는 삽입 순서를 유지합니다. 새 키 / 값 쌍을 추가하는 방법은 다음과 같습니다.

가장 간단한 해결책은

h[:key] = "bar"

방법을 원하면 다음을 사용하십시오 store.

h.store(:key, "bar")

정말로 “삽”연산자 ( <<) 를 사용하려면 실제로 해시 값에 배열로 추가되며 키를 지정해야합니다.

h[:key] << "bar"

위의 내용은 키가있는 경우에만 작동합니다. 새 키를 추가하려면 다음과 같이 할 수있는 기본값으로 해시를 초기화해야합니다.

h = Hash.new {|h, k| h[k] = ''}
h[:key] << "bar"

당신은 당신이 작성한 방식대로 작동하는 삽 연산자를 포함하기 위해 원숭이 패치 Hash를 유혹 할 수 있습니다.

class Hash
  def <<(k,v)
    self.store(k,v)
  end
end

그러나 이것은 다른 컨텍스트에서 삽 연산자에 적용된 “구문 설탕”을 상속하지 않습니다.

h << :key, "bar" #doesn't work
h.<< :key, "bar" #works


답변

아니요, 키 / 값 쌍을 추가 할 수 없다고 생각합니다. 내가 아는 가장 가까운 유일한 store방법 은 방법을 사용하는 것입니다.

h = {}
h.store("key", "value")


답변

아마도 Hash # merge를 원하십니까?

1.9.3p194 :015 > h={}
 => {}
1.9.3p194 :016 > h.merge(:key => 'bar')
 => {:key=>"bar"}
1.9.3p194 :017 >

제자리에서 배열을 변경하려면 merge!

1.9.3p194 :016 > h.merge!(:key => 'bar')
 => {:key=>"bar"}


답변

유사 그들이있다,로 merge!store치료 기존의 해시가 다르게 키 이름에 따라, 따라서 환경 설정에 영향을 미칠 것입니다. 구문 관점에서 그 외에는, merge!key: "value"구문은 밀접하게 자바 스크립트와 파이썬에 반대 일치합니다. 개인적으로 쉼표로 구분 된 키-값 쌍을 항상 싫어했습니다.

hash = {}
hash.merge!(key: "value")
hash.merge!(:key => "value")
puts hash

{:key=>"value"}

hash = {}
hash.store(:key, "value")
hash.store("key", "value")
puts hash

{:key=>"value", "key"=>"value"}

삽 작업자가 <<작동 하도록하려면 Mark Thomas 의 답변을 사용하는 것이 좋습니다.


답변

비슷한 작업을해야했지만 동일한 키로 값을 추가해야했습니다. 병합 또는 업데이트를 사용할 때 동일한 키로 값을 푸시 할 수 없습니다. 그래서 해시 배열을 사용해야했습니다.

    my_hash_static = {:header =>{:company => 'xx', :usercode => 'xx', :password => 'xx',
                      :type=> 'n:n', :msgheader => from}, :body=>[]}
    my_hash_dynamic = {:mp=>{:msg=>message, :no=>phones} }
    my_hash_full = my_hash_static[:body].push my_hash_dynamic


답변