Merge pull request #3315 from ksss/enumerator-with_index

Fix some incompatibility for Enumerator#with_index
This commit is contained in:
Yukihiro "Matz" Matsumoto
2016-12-03 11:58:39 +09:00
committed by GitHub
2 changed files with 13 additions and 4 deletions
+10 -4
View File
@@ -153,12 +153,18 @@ class Enumerator
#
def with_index(offset=0)
return to_enum :with_index, offset unless block_given?
raise TypeError, "no implicit conversion of #{offset.class} into Integer" unless offset.respond_to?(:to_int)
offset = if offset.nil?
0
elsif offset.respond_to?(:to_int)
offset.to_int
else
raise TypeError, "no implicit conversion of #{offset.class} into Integer"
end
n = offset.to_int - 1
enumerator_block_call do |i|
n = offset - 1
enumerator_block_call do |*i|
n += 1
yield [i,n]
yield i.__svalue, n
end
end
@@ -50,6 +50,9 @@ end
assert 'Enumerator#with_index' do
assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).with_index.to_a)
assert_equal([[1,5],[2,6],[3,7]], @obj.to_enum(:foo, 1, 2, 3).with_index(5).to_a)
a = []
@obj.to_enum(:foo, 1, 2, 3).with_index(10).with_index(20) { |*i| a << i }
assert_equal [[[1, 10], 20], [[2, 11], 21], [[3, 12], 22]], a
end
assert 'Enumerator#with_index nonnum offset' do