[#114774] [Ruby master Feature#19884] Make Safe Navigation Operator work on classes — "p8 (Petrik de Heus) via ruby-core" <ruby-core@...>
Issue #19884 has been reported by p8 (Petrik de Heus).
13 messages
2023/09/15
[ruby-core:114655] [Ruby master Bug#19864] Ruby 3.2 Changed Behavior With One Sided Ranges
From:
"jeremyevans0 (Jeremy Evans) via ruby-core" <ruby-core@...>
Date:
2023-09-06 12:56:12 UTC
List:
ruby-core #114655
Issue #19864 has been updated by jeremyevans0 (Jeremy Evans).
This appears to fix it:
```diff
diff --git a/range.c b/range.c
index 62e957e622..4b2e2460c7 100644
--- a/range.c
+++ b/range.c
@@ -1818,6 +1818,7 @@ range_string_cover_internal(VALUE range, VALUE val)
return r_cover_p(range, beg, end, val);
}
if (NIL_P(beg)) {
+unbounded_begin:;
VALUE r = rb_funcall(val, id_cmp, 1, end);
if (NIL_P(r)) return Qfalse;
if (RANGE_EXCL(range)) {
@@ -1826,12 +1827,20 @@ range_string_cover_internal(VALUE range, VALUE val)
return RBOOL(rb_cmpint(r, val, end) <= 0);
}
else if (NIL_P(end)) {
+unbounded_end:;
VALUE r = rb_funcall(beg, id_cmp, 1, val);
if (NIL_P(r)) return Qfalse;
return RBOOL(rb_cmpint(r, beg, val) <= 0);
}
}
+ if (!NIL_P(beg) && NIL_P(end)) {
+ goto unbounded_end;
+ }
+ if (NIL_P(beg) && !NIL_P(end)) {
+ goto unbounded_begin;
+ }
+
return range_include_fallback(beg, end, val);
}
```
I'll try to add tests and submit a pull request within a week.
----------------------------------------
Bug #19864: Ruby 3.2 Changed Behavior With One Sided Ranges
https://bugs.ruby-lang.org/issues/19864#change-104485
* Author: Aesthetikx (John DeSilva)
* Status: Open
* Priority: Normal
* ruby -v: 3.3.0
* Backport: 3.0: DONTNEED, 3.1: DONTNEED, 3.2: REQUIRED
----------------------------------------
Thank you for taking the time to read my issue. I know there has been some previous discussion here https://bugs.ruby-lang.org/issues/19533 regarding a similar issue, although I think this is different. I apologize if this has already been addressed.
Prior to Ruby 3.2, you could use a beginless or endless range, and use === (or a case statement) to determine if a given date matched that range. For example, (..today) === yesterday would have returned true, and (tomorrow..) === today would have returned false. Please see my attached file for a more concrete example.
Starting with Ruby 3.2, this results in "`===': cannot determine inclusion in beginless/endless ranges (TypeError)".
I can imagine that there is difficulty and ambiguity with these infinite ranges and non numeric objects, however I do feel that these examples with dates should work, especially since (..Date.today).cover?(Date.today) still works as expected.
---Files--------------------------------
range_test.rb (928 Bytes)
range_test_2.rb (411 Bytes)
range_test_3.rb (162 Bytes)
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/