해시 각 루프의 인덱스에 액세스 할 수 있습니까?


119

나는 아마도 분명한 것을 놓치고 있지만 각 루프 내에서 반복의 인덱스 / 수에 액세스하는 방법이 있습니까?

hash = {'three' => 'one', 'four' => 'two', 'one' => 'three'}
hash.each { |key, value| 
    # any way to know which iteration this is
    #   (without having to create a count variable)?
}

3
Anon : 아니요, 해시는 정렬되지 않습니다.
Mikael S

해시는 기술적으로 분류되지 않지만 루비에서는 어떤 의미에서 분류 할 수 있습니다. sort ()는 그것들을 정렬 된 중첩 배열로 변환합니다. 그런 다음 해시로 다시 변환 할 수 있습니다. your_hash.sort.to_h
jlesse

답변:


296

각 반복의 인덱스를 알고 싶다면 사용할 수 있습니다. .each_with_index

hash.each_with_index { |(key,value),index| ... }

24
구체적으로 :hash.each_with_index { |(key,value),index| ... }
rampion

22
괄호가 필요합니다. b / c hash.eachArray. 괄호는와 동일한 작업을 수행하여 (key,value) = arr첫 번째 값 (키)을에 key, 두 번째 값을에 넣습니다 value.
rampion

1
감사합니다 @ S.Mark, @rampion, 작동했습니다. each_with_indexRDoc for Hash : ruby-doc.org/core/classes/Hash.html에 나열 되지 않았습니다 . 이제 Enumerable의 멤버임을 알 수 있습니다. 그러나 RDoc이 each_with_indexHash.html에서 상호 참조 할 수 없다는 것이 너무 나쁩니다.
Upgradingdave

2
@Dave_Paroulek 나는 종종 같은 것을 원했습니다. vi를 사용하여 클래스의 메서드를 확인할 때 부모 모듈을 수동으로 확인하는 것이 필요하다는 것을 알았습니다. 종종 나는 그냥 건너 뛰고 내가 놓친 것이 없는지 확인하기 위해 irb사용 ClassName#instance_methods합니다.
rampion

들으, @rampion은 ClassName#instance_methods매우 도움이되었습니다
Upgradingdave

11

키를 반복하고 수동으로 값을 가져올 수 있습니다.

hash.keys.each_with_index do |key, index|
   value = hash[key]
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

편집 : rampion의 의견에 따라 반복하면 키와 값을 튜플로 얻을 수 있음을 방금 배웠습니다 hash.

hash.each_with_index do |(key, value), index|
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

루프 및 잘못된 코드 내부에서 반복 된 컬렉션에 액세스하기 위해 비추천 : key첫 번째 루프에는 키 + 값 쌍의 배열이 있으므로 인덱스로 사용하는 hash것은 잘못되었습니다. 테스트 해본 적이 있습니까?
SasQ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.