each_with_index 루프 반복기에서 인덱스 오프셋을 정의 할 수 있습니까? 내 솔직한 시도는 실패했습니다.
some_array.each_with_index{|item, index = 1| some_func(item, index) }
편집하다:
설명 : 배열 오프셋을 원하지 않습니다. each_with_index 내의 인덱스가 0에서 시작하지 않고 예를 들어 1로 시작하기를 원합니다.
each_with_index 루프 반복기에서 인덱스 오프셋을 정의 할 수 있습니까? 내 솔직한 시도는 실패했습니다.
some_array.each_with_index{|item, index = 1| some_func(item, index) }
편집하다:
설명 : 배열 오프셋을 원하지 않습니다. each_with_index 내의 인덱스가 0에서 시작하지 않고 예를 들어 1로 시작하기를 원합니다.
답변:
실제로 Enumerator#with_index
오프셋을 선택적 매개 변수로받습니다.
[:foo, :bar, :baz].to_enum.with_index(1).each do |elem, i|
puts "#{i}: #{elem}"
end
출력 :
1: foo
2: bar
3: baz
BTW, 나는 1.9.2에만 있다고 생각합니다.
with_index
더 PARAMS을에서 인덱스0
1) 가장 간단한 방법은 함수 index+1
대신 대체하는 것입니다 index
.
some_array.each_with_index{|item, index| some_func(item, index+1)}
그러나 아마도 그것은 당신이 원하는 것이 아닙니다.
2) 다음으로 할 수있는 일은 j
블록 내에서 다른 인덱스를 정의 하고 원래 인덱스 대신 사용하는 것입니다.
some_array.each_with_index{|item, i| j = i + 1; some_func(item, j)}
3) 이러한 방식으로 인덱스를 자주 사용하려면 다른 방법을 정의하십시오.
module Enumerable
def each_with_index_from_one *args, &pr
each_with_index(*args){|obj, i| pr.call(obj, i+1)}
end
end
%w(one two three).each_with_index_from_one{|w, i| puts "#{i}. #{w}"}
# =>
1. one
2. two
3. three
몇 년 전에 답변 된이 답변은 이제 구식입니다. 현대 루비의 경우 Zack Xu의 답변이 더 잘 작동합니다.
+1
내 코드에서 +2
또는 +10
. 그것도 작동합니다.
나는 그것을 만났다.
필요하지 않은 내 솔루션이 최고이지만 저에게 효과적이었습니다.
보기 반복에서 :
추가하기 : index + 1
그 색인 번호에 대한 참조를 사용하지 않고 목록에 표시하기 위해 사용하기 때문에 그게 전부입니다.
그래 넌 할수있어
some_array[offset..-1].each_with_index{|item, index| some_func(item, index) }
some_array[offset..-1].each_with_index{|item, index| some_func(item, index+offset) }
some_array[offset..-1].each_with_index{|item, index| index+=offset; some_func(item, index) }
UPD
또한 오프셋이 배열 크기보다 크면 오류가 발생한다는 것을 알아야합니다. 때문에:
some_array[1000,-1] => nil
nil.each_with_index => Error 'undefined method `each_with_index' for nil:NilClass'
여기서 무엇을 할 수 있습니까?
(some_array[offset..-1]||[]).each_with_index{|item, index| some_func(item, index) }
또는 오프셋을 사전 검증하려면 :
offset = 1000
some_array[offset..-1].each_with_index{|item, index| some_func(item, index) } if offset <= some_array.size
이것은 약간 해키입니다.
UPD 2
질문을 업데이트하고 이제 배열 오프셋이 필요하지 않지만 인덱스 오프셋이 필요하므로 @sawa 솔루션이 잘 작동합니다.
아리엘이 맞습니다. 이것은 이것을 처리하는 가장 좋은 방법이며 그렇게 나쁘지는 않습니다.
ary.each_with_index do |a, i|
puts i + 1
#other code
end
그것은 완벽하게 수용 가능하며 내가 본 대부분의 솔루션보다 낫습니다. 나는 항상 이것이 #inject의 목적이라고 생각했습니다.