두 개의 어레이를 동시에 반복하는 'Ruby way'는 무엇입니까?
해결할 문제라기보다는 구문에 대한 호기심이 더 강합니다.
길이가 같은 배열이 두 개 있는데 두 배열을 동시에 반복하려고 합니다. 예를 들어, 두 배열의 값을 모두 특정 인덱스로 출력하는 것입니다.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
나는 내가 사용할 수 있다는 것을 알고 있습니다.each_index다음과 같은 방식으로 어레이에 인덱스를 수행합니다.
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
이것을 더 잘 할 수 있는 루비 방법이 있습니까?이런 거?
# Obviously doesn't achieve what I want it to - but is there something like this?
[@budget, @actual].each do |budget, actual|
puts budget
puts actual
end
>> @budget = [ 100, 150, 25, 105 ]
=> [100, 150, 25, 105]
>> @actual = [ 120, 100, 50, 100 ]
=> [120, 100, 50, 100]
>> @budget.zip @actual
=> [[100, 120], [150, 100], [25, 50], [105, 100]]
>> @budget.zip(@actual).each do |budget, actual|
?> puts budget
>> puts actual
>> end
100
120
150
100
25
50
105
100
=> [[100, 120], [150, 100], [25, 50], [105, 100]]
방법을 사용하고 블록을 전달하여 해당 요소에 대해 순차적으로 반복합니다.
열거자를 사용하여 두 개의 어레이를 동시에 반복할 수 있는 또 다른 방법이 있습니다.
2.1.2 :003 > enum = [1,2,4].each
=> #<Enumerator: [1, 2, 4]:each>
2.1.2 :004 > enum2 = [5,6,7].each
=> #<Enumerator: [5, 6, 7]:each>
2.1.2 :005 > loop do
2.1.2 :006 > a1,a2=enum.next,enum2.next
2.1.2 :007?> puts "array 1 #{a1} array 2 #{a2}"
2.1.2 :008?> end
array 1 1 array 2 5
array 1 2 array 2 6
array 1 4 array 2 7
열거자는 다른 기술 중에서도 무한 직렬, 병렬 반복을 허용하기 때문에 위에서 사용된 예제보다 더 강력합니다.
원래 질문과 관련하여 값을 순환시킬 길이가 동일하지 않은 배열을 반복할 때 사용할 수 있습니다.
[1,2,3,4,5,6].zip([7,8,9].cycle)
루비가 당신에게 줄 것입니다.
[[1, 7], [2, 8], [3, 9], [4, 7], [5, 8], [6, 9]]
이를 통해 사용자는 다음과 같은 이점을 얻을 수 있습니다.nilzip을 사용하는 것만으로도 얻을 수 있는 가치.
에 더하여a.zip(b).each{|x,y| }다른 사람들이 말했듯이, 당신은 또한 말할 수 있습니다.[a,b].transpose.each{|x,y| }조금 더 대칭적인 느낌이 드는군요.하지만 아마 그렇게 빠르지는 않을 거예요, 왜냐하면 당신이 여분을 만들고 있기 때문입니다.[a,b]배열
어레이를 처리하는 경우 두 어레이를 함께 압축하는 것이 좋습니다.그러나 다음과 같은 끝없는 열거자를 다루고 있다면 어떨까요?
enum1 = (1..5).cycle
enum2 = (10..12).cycle
enum1.zip(enum2)실패 이유:zip에서는 모든 요소를 평가하고 결합하려고 합니다.대신 다음 작업을 수행합니다.
enum1.lazy.zip(enum2)
그거요.lazy결과 열거자를 게으르게 만들어 저장합니다.
타협하고 #each_with_index를 사용하는 것은 어떻습니까?
include Enumerable
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
@budget.each_with_index { |val, i| puts val; puts @actual[i] }
언급URL : https://stackoverflow.com/questions/3580049/whats-the-ruby-way-to-iterate-over-two-arrays-at-once
'programing' 카테고리의 다른 글
| Mipmap 대 그리기 가능한 폴더 (0) | 2023.06.03 |
|---|---|
| 제출하기 전에 앱에 대한 항목 링크 가져오기 (0) | 2023.06.03 |
| ViewController가 Modal로 표시되는지 여부를 확인할 수 있습니까? (0) | 2023.06.03 |
| iOS 앱에서 문서 폴더 내부에 폴더 만들기 (0) | 2023.06.03 |
| Spnet 코어에서 Excel로 내보내기 (0) | 2023.06.03 |