Ruby에서는 << :를 사용하여 기존 배열에 값을 추가 할 수 있습니다.
a = []
a << "foo"
하지만 기존 해시에 키 / 값 쌍을 추가 할 수도 있습니까?
h = {}
h << :key "bar"
나는 당신이 할 수 있다는 것을 압니다.
h[:key] = ""
h[: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