Ruby에서 기존 해시에 추가하는 방법


102

추가에 관하여 key => valueRuby의 기존 채워진 해시에 쌍 Apress의 Beginning Ruby를 통해 작업하는 중이며 해시 장을 방금 마쳤습니다.

해시로 동일한 결과를 얻을 수있는 가장 간단한 방법을 찾으려고합니다.

x = [1, 2, 3, 4]
x << 5
p x

답변:


189

해시가있는 경우 키로 참조하여 항목을 추가 할 수 있습니다.

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

여기서는 [ ]빈 배열 { }을 만드는 것과 같이 빈 해시를 만듭니다.

배열에는 특정 순서로 0 개 이상의 요소가 있으며 요소가 중복 될 수 있습니다. 해시에는 key로 구성된 0 개 이상의 요소 가 있습니다. 여기서 키는 복제되지 않지만 해당 위치에 저장된 값은 복제 될 수 있습니다.

Ruby의 해시는 매우 유연하며 던질 수있는 거의 모든 유형의 키를 가질 수 있습니다. 이것은 다른 언어에서 찾을 수있는 사전 구조와 다릅니다.

해시 키의 특정 특성이 종종 중요하다는 점을 기억하는 것이 중요합니다.

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails는 HashWithIndifferentAccess를 제공하여 Symbol과 String 주소 지정 방법간에 자유롭게 변환 할 수 있도록하여이를 다소 혼동합니다.

클래스, 숫자 또는 기타 해시를 포함하여 거의 모든 항목에 대해 색인을 생성 할 수도 있습니다.

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

해시는 배열로 또는 그 반대로 변환 할 수 있습니다.

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

해시에 "삽입"하는 경우 한 번에 하나씩 수행하거나 merge방법을 사용하여 해시를 결합 할 수 있습니다 .

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

이것은 원래 해시를 변경하지 않고 대신 새 해시를 반환합니다. 한 해시를 다른 해시로 결합하려면 다음 merge!방법을 사용할 수 있습니다 .

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

String 및 Array의 많은 메서드와 마찬가지로 !내부 작업 임을 나타냅니다 .


12
귀중한 정보가 많지만 @robbrit가 대답 한 가장 기본적인 공식이 부족합니다.
danh

1
가급적이면 상단 근처에있는 질문에 실제로 답변하도록 답변을 수정하십시오. 당신을 위해 그렇게하는 것은 무례 할 것입니다.
Stephan

@Stephan 상단에 더 간결한 예를 추가했습니다.
tadman 2015 년


34

두 개 이상을 추가하려는 경우 :

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash

8
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x

나는 이것을 다음과 같이 구현하려고 시도했다 : x['key'] = "value"그러나 나는 오류를 받고있다. 내가 문자열로 작업하고 있음을 언급해야합니다.
Tom

1
오류가 무엇입니까? 당신이 더 구체적이지 않는 한 그것은 무엇이든 될 수 있습니다.
tadman

1
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

병합 된 값을 반환합니다.

hash
 => {:a=>"a", :b=>"b"} 

그러나 호출자 개체를 수정하지 않습니다.

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

재 할당은 트릭을 수행합니다.


0
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

사용자 입력에서 키와 값을 가져올 수 있으므로 Ruby를 사용할 수 있습니다. .to_sym 은 문자열을 기호 로 변환 하고 .to_i 는 문자열을 정수로 변환합니다.
예를 들면 :

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.

0

Ruby 2.0부터 사용할 수있는 이중 표시 연산자를 사용할 수 있습니다.

h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.