[Bug #19426] Fix endless Range#step
with #succ
method
This commit is contained in:
parent
8edd350bda
commit
da4464b824
Notes:
git
2023-02-09 14:05:28 +00:00
6
range.c
6
range.c
@ -532,7 +532,11 @@ range_step(int argc, VALUE *argv, VALUE range)
|
|||||||
rb_raise(rb_eTypeError, "can't iterate from %s",
|
rb_raise(rb_eTypeError, "can't iterate from %s",
|
||||||
rb_obj_classname(b));
|
rb_obj_classname(b));
|
||||||
}
|
}
|
||||||
range_each_func(range, step_i, (VALUE)iter);
|
if (!NIL_P(e))
|
||||||
|
range_each_func(range, step_i, (VALUE)iter);
|
||||||
|
else
|
||||||
|
for (;; b = rb_funcallv(b, id_succ, 0, 0))
|
||||||
|
step_i(b, (VALUE)iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return range;
|
return range;
|
||||||
|
@ -392,6 +392,26 @@ class TestRange < Test::Unit::TestCase
|
|||||||
assert_equal(4, (1.0...5.6).step(1.5).to_a.size)
|
assert_equal(4, (1.0...5.6).step(1.5).to_a.size)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_step_with_succ
|
||||||
|
c = Struct.new(:i) do
|
||||||
|
def succ; self.class.new(i+1); end
|
||||||
|
def <=>(other) i <=> other.i;end
|
||||||
|
end.new(0)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
(c..c.succ).step(2) do |d|
|
||||||
|
result << d.i
|
||||||
|
end
|
||||||
|
assert_equal([0], result)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
(c..).step(2) do |d|
|
||||||
|
result << d.i
|
||||||
|
break if d.i >= 4
|
||||||
|
end
|
||||||
|
assert_equal([0, 2, 4], result)
|
||||||
|
end
|
||||||
|
|
||||||
def test_each
|
def test_each
|
||||||
a = []
|
a = []
|
||||||
(0..10).each {|x| a << x }
|
(0..10).each {|x| a << x }
|
||||||
@ -456,6 +476,26 @@ class TestRange < Test::Unit::TestCase
|
|||||||
assert_equal(["a", "b", "c"], a)
|
assert_equal(["a", "b", "c"], a)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_each_with_succ
|
||||||
|
c = Struct.new(:i) do
|
||||||
|
def succ; self.class.new(i+1); end
|
||||||
|
def <=>(other) i <=> other.i;end
|
||||||
|
end.new(0)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
(c..c.succ).each do |d|
|
||||||
|
result << d.i
|
||||||
|
end
|
||||||
|
assert_equal([0, 1], result)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
(c..).each do |d|
|
||||||
|
result << d.i
|
||||||
|
break if d.i >= 4
|
||||||
|
end
|
||||||
|
assert_equal([0, 1, 2, 3, 4], result)
|
||||||
|
end
|
||||||
|
|
||||||
def test_begin_end
|
def test_begin_end
|
||||||
assert_equal(0, (0..1).begin)
|
assert_equal(0, (0..1).begin)
|
||||||
assert_equal(1, (0..1).end)
|
assert_equal(1, (0..1).end)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user