2016-09-29 3 views
2

해시 배열을 생성하는 배열에 여러 해시를 삽입하고 싶습니다. 그러나 배열에 새 해시를 추가 할 때마다 이전 해시를 덮어 씁니다. 무슨 일이 일어나고 있는지 아십니까?ruby ​​- 여러 개의 해시를 루비의 배열에 삽입

partArray = [] 
partHash = {} 

partHash["name"] = "Item1" 
partHash["owner"] = "Item1" 

#Insert first hash into array 
partArray << partHash 
puts partArray 

#new set of key, value pairs 
#to be appended to array 
partHash["name"] = "Item2" 
partHash["owner"] = "Item2" 

#Append second hash into array 
partArray << partHash 

puts partArray 

출력 : 첫 번째 해시 값을 덮어 이유를 잘 모르겠어요

{"name"=>"Item1", "owner"=>"Item1"} 
new Array is : 
{"name"=>"Item2", "owner"=>"Item2"} 
{"name"=>"Item2", "owner"=>"Item2"} 

. 어떤 도움을 주셔서 감사합니다.

+1

아마도이 되거 것입니다 (: OBJECT_ID)' –

+0

다른 값으로, 동일한 해시 OBJECT_ID를 받고. { "name"=> "Item1", "owner"=> "Item1"} [70094101888900] 새 배열은 { "name"=> "Item2", "owner"=> "Item2"} { "name"=> "Item2", "owner"=> "Item2"} [70094101888900, 70094101888900] – danynl

답변

4

동일한 해시를 배열의 서로 다른 두 위치에 저장합니다. Ruby를 오브젝트 참조을 추가 할 때마다 오브젝트를 다른 오브젝트 내부에 중첩 할 때마다 복사하는 것이 아니라고 생각하십시오.

다른 값으로이 작업을 수행합니까, 당신은 새로운 각 시간을 만들 수 있습니다 :

두 번 배열에서 같은 일을 데려 가고 싶다는 이유 정당한 이유가있다
part_array = [ ] 
part_array << { 
    # ... Hash entry 
} 

때문일 수 있습니다 큰 데이터 구조를 사용할 때 메모리를 절약하는 방법.

참고로 Ruby는 으로 강하게 나타납니다.은 모두 part_array과 같은 변수 이름을 추천합니다 (모두 소문자). 마찬가지로 해시 키의 경우 기호가 내부적으로 저렴하기 때문에 기호를 선호하는 경우가 많습니다.

+0

새 항목을 추가 할 때마다 배열과 해시를 다시 초기화해야합니까? – danynl

+0

해시 만 삽입하면 매번 변경되는 것입니다. 배열을 변경하면 배열의 마지막 항목 만 있습니다. – tadman

+0

맞아, 나는 그렇게했고 그것은 잘 작동했다. – danynl

1

왜 첫 번째 해시의 값을 덮어 썼는지 모르겠습니다.

먼저 빈 배열과 빈 해시를 정의합니다.

partArray = [] 
partHash = {} 

이제 해시에 두 개의 새로운 키 - 값 쌍을 만듭니다. 이 키는 현재 partHash 내에 존재하지 않으므로 생성됩니다.

partHash["name"] = "Item1" 
partHash["owner"] = "Item1" 
parthHash #{"name"=>"Item1", "owner"=>"Item1"} 

우리 배열로 우리 해시 삽입 : 여기

partArray << partHash 
partArray #[{"name"=>"Item1", "owner"=>"Item1"}] 

는 중요한 단계이다. "name""owner" 키가 해시 내에 이미 있기 때문에 []= 표기법은 기존 값을 다시 정의하기 만합니다.

partHash["name"] = "Item2" 
partHash["owner"] = "Item2" 
partHash # {"name"=>"Item2", "owner"=>"Item2"} 
partArray #[{"name"=>"Item2", "owner"=>"Item2"}] 

현재 partArray는 하나의 partsHash 해시가 포함되어 있습니다. 마지막으로 다시 partArraypartHash를 추가 :`P는 partArray.map :

partArray << partHash 
partArray #[{"name"=>"Item2", "owner"=>"Item2"}, {"name"=>"Item2", "owner"=>"Item2"}] 
+0

예, 무슨 일이 일어 났는지 이해하고 이전 항목을 제거하기 위해 해시를 다시 초기화하여 문제를 해결했습니다. – danynl

관련 문제