diff options
author | zverok <[email protected]> | 2024-08-25 20:58:47 +0300 |
---|---|---|
committer | Akinori Musha <[email protected]> | 2024-09-03 16:21:42 +0900 |
commit | 245ed2fc890f7f33526e1c0f42b79c30366493e6 () | |
tree | 8879a308984a12dcb53580543fa1a20c638f026f /range.c | |
parent | 452eb24b1566f3fd8319e9eeb0ece6758eace08d (diff) |
Range#step: restore legacy behavior for String ranges
Notes: Merged: https://.com/ruby/ruby/pull/11454
-rw-r--r-- | range.c | 60 |
1 files changed, 56 insertions, 4 deletions
@@ -309,6 +309,34 @@ range_each_func(VALUE range, int (*func)(VALUE, VALUE), VALUE arg) } } static int discrete_object_p(VALUE obj) { @@ -430,9 +458,18 @@ range_step_size(VALUE range, VALUE args, VALUE eobj) * * For non-Numeric ranges, step absence is an error: * - * ('a'..'z').step { p _1 } * # raises: step is required for non-numeric ranges (ArgumentError) * */ static VALUE range_step(int argc, VALUE *argv, VALUE range) @@ -445,11 +482,15 @@ range_step(int argc, VALUE *argv, VALUE range) const VALUE b_num_p = rb_obj_is_kind_of(b, rb_cNumeric); const VALUE e_num_p = rb_obj_is_kind_of(e, rb_cNumeric); if (rb_check_arity(argc, 0, 1)) step = argv[0]; else { - if (b_num_p || (NIL_P(b) && e_num_p)) step = INT2FIX(1); else rb_raise(rb_eArgError, "step is required for non-numeric ranges"); @@ -520,8 +561,19 @@ range_step(int argc, VALUE *argv, VALUE range) } else if (b_num_p && step_num_p && ruby_float_step(b, e, step, EXCL(range), TRUE)) { /* done */ - } - else { v = b; if (!NIL_P(e)) { if (b_num_p && step_num_p && r_less(step, INT2FIX(0)) < 0) { |