programing

두 개의 어레이를 동시에 반복하는 'Ruby way'는 무엇입니까?

subpage 2023. 6. 3. 08:27
반응형

두 개의 어레이를 동시에 반복하는 '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

반응형