해시 ({})가 해시 멤버를 숨기는 이유는 무엇입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1822021

  •  10-07-2019
  •  | 
  •  

문제

좋아, 그래서 나는 기본 값으로 빈 해시를 가진 해시를 만들고 싶었다. 조금 이상하지만, 나는 알고 있지만 그것이 유용 할 것이라고 생각합시다.

그래서 여기에 내가 한 일이 있습니다.

>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1

다시 말해, 해시를 검사 할 때 해시 멤버가 보이지 않지만 키로 액세스 할 수 있습니다.

이것이 예상되는 행동입니까? 여기서 무슨 일이 일어나고 있습니까?

BTW, 이것은 Ruby 1.9.1이며 이전 버전을 시도하지 않았습니다.

편집 : 해시 해시 해시 일 필요가 없으므로 단순화 된 예제 ...

도움이 되었습니까?

해결책

모든 루비 버전에서 행동이 예상됩니다. 그리고 조금 더 실험하면 어떤 키를 사용하든 항상 동일한 해시에 액세스 할 수 있습니다.

>> a[:a][:b] = 1
=> 1
>> a[:c][:d] = 2
=> 2
>> a[:d]
=> {:b=>1, :d=>2}

기본 인수가있는 해시가 작동하는 방식은 다음과 같습니다. hash[key] 해시에 그 키가 존재하는지 확인합니다. 그렇다면 해당 키의 값을 반환합니다. 그렇지 않으면 기본값을 반환합니다. 키를 해시에 추가하지 않으며 매번 동일한 기본 오브젝트 (사본이 아님)를 반환합니다.

원하는 것을 얻으려면 대신 기본 블록을 지정하려고합니다. 그렇게하면 해시에없는 키에 액세스 할 때마다 블록이 실행됩니다. 블록 내부에서 새 해시를 만들고 키를 해시의 "포인트"로 설정할 수 있습니다. 그렇게 :

Hash.new { |h,k|  h[k] = {} }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top