문제

루비에서 해시 해시를 생성하면 편리한 두 (또는 그 이상의) 치수 조회가 가능합니다. 그러나 삽입 할 때 첫 번째 인덱스가 해시에 이미 존재하는지 항상 확인해야합니다. 예를 들어:

h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert

새 해시가 자동으로 생성되는 다음을 수행하는 것이 바람직합니다.

h = Hash.new
h['x']['y'] = value_to_insert

마찬가지로, 첫 번째 색인이 아직 존재하지 않는 값을 찾을 때 '[]'오류에 대한 정의되지 않은 메소드를받지 않고 NIL을 반환하는 경우 바람직합니다.

looked_up_value = h['w']['z']

이 동작을 가진 해시 래퍼 클래스를 만들 수 있지만이 작업을 수행하기위한 기존 루비 관용구가 있습니까?

도움이 되었습니까?

해결책

당신은 통과 할 수 있습니다 Hash.new 함수 쿼리 된 값이 아직 존재하지 않는 경우 기본값을 산출하기 위해 실행 된 블록.

h = Hash.new { |h, k| h[k] = Hash.new }

물론 이것은 재귀 적으로 수행 될 수 있습니다.

/편집 : 와우, 있습니다 기사 이 질문에 대답합니다.

완전성을 위해 자의 깊이 해시에 대한 기사의 해결책은 다음과 같습니다.

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))

크레딧은 켄트로갑니다 데이터 노이즈.

다른 팁

자가 변형은 부름을받는 축복이자 저주입니다. 문제는 값이 정의되기 전에 값을 "보"하면 슬롯 에이 빈 해시에 붙어 있으며 나중에 차단해야한다는 것입니다.

약간의 무정부 상태가 마음에 들지 않으면 언제든지 쿼리대로 예상 구조를 구성 할 수있는 스타일 선언을 항상 잼 할 수 있습니다.

((h ||= { })['w'] ||= { })['z']
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top