Ruby에서 each.with_index와 each_with_index의 차이점은 무엇입니까?


93

each.with_index과 의 차이점에 대해 정말 혼란 스럽습니다 each_with_index. 그들은 다른 유형을 가지고 있지만 실제로는 동일한 것처럼 보입니다.


6
이외에도 약간의 차이로부터 with_index오프셋 시작 인덱스 허가증 with_index과 함께 사용될 때 일반적으로 선호된다 map, reduce, collect등 즉, map.with_index더 이상 판독한다 each_with_index.map. 어떤 의미에서와 함께 사용하면 map존재하지 않는 map_with_index방법 의 대립 입니다.
Cary Swoveland 2013

답변:


170

with_index메서드는 시작 인덱스를 오프셋하는 선택적 매개 변수를 사용합니다. each_with_index동일한 작업을 수행하지만 선택적 시작 색인이 없습니다.

예를 들면 :

[:foo, :bar, :baz].each.with_index(2) do |value, index|
    puts "#{index}: #{value}"
end

[:foo, :bar, :baz].each_with_index do |value, index|
    puts "#{index}: #{value}"
end

출력 :

2: foo
3: bar
4: baz

0: foo
1: bar
2: baz

41

each_with_index이전에 Ruby에 도입되었습니다. with_index나중에 소개되었습니다.

  1. 다양한 열거 자와 함께 더 광범위하게 사용할 수 있습니다.
  2. 인덱스가 이외의 숫자에서 시작할 수 있도록 0합니다.

오늘날 with_index에는 일반 성과 가독성의 관점에서를 사용하는 것이 더 좋지만 코드 속도를 높이는 관점 each_with_index에서는 each.with_index.

몇 가지 방법을 간단하게 연결하여 단일 방법을 쉽게 표현할 수 있다고 생각되면 일반적으로 단일 방법이 체인보다 빠릅니다. 이것의 또 다른 예로서, reverse_each보다 빠른 실행됩니다 reverse.each. 이러한 방법은 존재하는 이유가 있습니다.


1
공정하게 말하면 오프셋은 인덱스를 변경하지 않고 단순히 인덱스에 숫자를 추가합니다. 통화 후 색인을 확인하면 영향을받지 않음을 알 수 있습니다. 평소 @sawa 좋은 노트
VGOFF

2
나는 성능이 달라야한다고 생각하지 않는다 (적어도 실질적으로). 이 reverse예제 에서는 reverse열거자가 아닌 다른 배열을 반환합니다. 열거자를 반환했다면 좋은 구현으로 더 느려서는 안됩니다.
akostadinov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.