ruby-changes:25460
From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:15:09 +0900 (JST)
Subject: [ruby-changes:25460] marcandRe: r37517 (trunk): * range.c: Support for range.step.size
marcandre 2012-11-07 02:15:00 +0900 (Wed, 07 Nov 2012) New Revision: 37517 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37517 Log: * range.c: Support for range.step.size [Feature #6636] Modified files: trunk/range.c trunk/test/ruby/test_enumerator.rb Index: range.c =================================================================== --- range.c (revision 37516) +++ range.c (revision 37517) @@ -315,7 +315,30 @@ return rb_respond_to(obj, id_succ); } +static VALUE +range_step_size(VALUE range, VALUE args) +{ + VALUE b = RANGE_BEG(range), e = RANGE_END(range); + VALUE step = INT2FIX(1); + if (args) { + step = RARRAY_PTR(args)[0]; + if (!rb_obj_is_kind_of(step, rb_cNumeric)) { + step = rb_to_int(step); + } + } + if (rb_funcall(step, '<', 1, INT2FIX(0))) { + rb_raise(rb_eArgError, "step can't be negative"); + } + else if (!rb_funcall(step, '>', 1, INT2FIX(0))) { + rb_raise(rb_eArgError, "step can't be 0"); + } + if (rb_obj_is_kind_of(b, rb_cNumeric) && rb_obj_is_kind_of(e, rb_cNumeric)) { + return num_interval_step_size(b, e, step, EXCL(range)); + } + return Qnil; +} + /* * call-seq: * rng.step(n=1) {| obj | block } -> rng @@ -355,7 +378,7 @@ { VALUE b, e, step, tmp; - RETURN_ENUMERATOR(range, argc, argv); + RETURN_SIZED_ENUMERATOR(range, argc, argv, range_step_size); b = RANGE_BEG(range); e = RANGE_END(range); Index: test/ruby/test_enumerator.rb =================================================================== --- test/ruby/test_enumerator.rb (revision 37516) +++ test/ruby/test_enumerator.rb (revision 37517) @@ -536,6 +536,12 @@ assert_equal 1, 42.step(Float::INFINITY, Float::INFINITY).size assert_equal 14, 0.1.step(4.2, 0.3).size assert_equal Float::INFINITY, 42.step(Float::INFINITY, 2).size + + assert_equal 10, (1..10).step.size + assert_equal 4, (1..10).step(3).size + assert_equal 3, (1...10).step(3).size + assert_equal Float::INFINITY, (42..Float::INFINITY).step(2).size + assert_raise(ArgumentError){ (1..10).step(-2).size } end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/