From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=3.0 tests=AWL,BAYES_00, DKIM_ADSP_CUSTOM_MED,FORGED_GMAIL_RCVD,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 36DBC1F5AE for ; Sun, 19 Jul 2020 10:00:00 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id A4E8A120996; Sun, 19 Jul 2020 18:59:26 +0900 (JST) Received: from xtrwkhkc.outbound-mail.sendgrid.net (xtrwkhkc.outbound-mail.sendgrid.net [167.89.16.28]) by neon.ruby-lang.org (Postfix) with ESMTPS id 781EC120992 for ; Sun, 19 Jul 2020 18:59:24 +0900 (JST) Received: by filterdrecv-p3mdw1-75c584b9c6-qfkhm with SMTP id filterdrecv-p3mdw1-75c584b9c6-qfkhm-21-5F141992-6 2020-07-19 09:59:46.161792502 +0000 UTC m=+1961413.675239821 Received: from herokuapp.com (unknown) by geopod-ismtpd-6-3 (SG) with ESMTP id R9rpmpcMQdSiQeiqYJSYDg for ; Sun, 19 Jul 2020 09:59:46.064 +0000 (UTC) Date: Sun, 19 Jul 2020 09:59:46 +0000 (UTC) From: eregontp@gmail.com Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 75012 X-Redmine-Project: ruby-master X-Redmine-Issue-Tracker: Bug X-Redmine-Issue-Id: 17017 X-Redmine-Issue-Author: sambostock X-Redmine-Sender: Eregon X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: =?us-ascii?Q?KippOI8ZHtTweq7XfQzW93937kJ4QNWwSBuHnaMEcr3WHd2EyLIDuMHlB3I1qh?= =?us-ascii?Q?yysIIw9tf=2FPmhdWv+oZxV1sqwVh6wc90ZlDBeqT?= =?us-ascii?Q?bcbg8j5LXh+gFl2RMVTHM=2FSsUd4618q2Iwuf4NG?= =?us-ascii?Q?K0ITsledeXqox0igQ8JGZCBdVsbABqR7tyPWcDp?= =?us-ascii?Q?u9kIjkFQR46wpVbu9IXKHNTtO7VFc8BsfCULVUW?= =?us-ascii?Q?8V3v3saeRDPlBjzbA=3D?= To: ruby-core@ruby-lang.org X-ML-Name: ruby-core X-Mail-Count: 99223 Subject: [ruby-core:99223] [Ruby master Bug#17017] Range#max & Range#minmax incorrectly use Float end as max X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #17017 has been updated by Eregon (Benoit Daloze). marcandre (Marc-Andre Lafortune) wrote in #note-15: > Unless I'm mistaken, this behavior change was not approved by Matz (or anybody else), changes a behavior that dates back to Ruby 1.8, breaks (that we know of) `activemodel` and `rubocop`, doesn't even raise the right error and isn't tested, ... Which change is that? The first PR above, https://github.com/ruby/ruby/pull/3306 ? That seems to have some tests. > Yet when you propose that that commit remains as is and that someone else has to bring up the situation with Matz, no other committer seems confused by this. I think the first PR should already have matz's or at least someone's else review. Range is full of edge and special cases though, and there seems to be no global vision for it. Maybe a good step here would be try to define the semantics we'd like for it. Obviously it's quite some work. If reverting the first PR helps, maybe we should do that first? ---------------------------------------- Bug #17017: Range#max & Range#minmax incorrectly use Float end as max https://bugs.ruby-lang.org/issues/17017#change-86604 * Author: sambostock (Sam Bostock) * Status: Open * Priority: Normal * ruby -v: ruby 2.8.0dev (2020-07-14T04:19:55Z master e60cd14d85) [x86_64-darwin17] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- While continuing to add edge cases to [`Range#minmax` specs](https://github.com/ruby/spec/pull/777), I discovered the following bug: ```ruby (1..3.1).to_a == [1, 2, 3] # As expected (1..3.1).to_a.max == 3 # As expected (1..3.1).to_a.minmax == [1, 3] # As expected (1..3.1).max == 3.1 # Should be 3, as above (1..3.1).minmax == [1, 3.1] # Should be [1, 3], as above ``` One way to detect this scenario might be to do (whatever the C equivalent is of) ```ruby range_end.is_a?(Numeric) // Is this a numeric range? && (range_end - range_begin).modulo(1) == 0 // Can we reach the range_end using the standard step size (1) ``` As for how to handle it, a couple options come to mind: - We could error out and do something similar to what we do for exclusive ranges ```ruby raise TypeError, 'cannot exclude non Integer end value' ``` - We might be able to calculate the range end by doing something like ```ruby num_steps = (range_end / range_beg).to_i - 1 # one fewer steps than would exceed the range_end max = range_beg + num_steps # take that many steps all at once ``` - We could delegate to `super` and enumerate the range to find the max ```ruby super ``` - We could update the documentation to define the max for this case as the `range_end`, similarly to how the documentation for `include?` says it behaves like `cover?` for numeric ranges. -- https://bugs.ruby-lang.org/