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.6 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=no 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 84B0D1F4B4 for ; Wed, 13 Jan 2021 17:35:32 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 903C1120A73; Thu, 14 Jan 2021 02:34:41 +0900 (JST) Received: from o1678948x4.outbound-mail.sendgrid.net (o1678948x4.outbound-mail.sendgrid.net [167.89.48.4]) by neon.ruby-lang.org (Postfix) with ESMTPS id 488D8120A70 for ; Thu, 14 Jan 2021 02:34:38 +0900 (JST) Received: by filterdrecv-p3iad2-577c7fd65d-dsc5v with SMTP id filterdrecv-p3iad2-577c7fd65d-dsc5v-18-5FFF2F5E-24 2021-01-13 17:35:26.194759015 +0000 UTC m=+81414.460122457 Received: from herokuapp.com (unknown) by ismtpd0097p1iad2.sendgrid.net (SG) with ESMTP id p6zJKPzhQQGzs6sBmrnlEA for ; Wed, 13 Jan 2021 17:35:26.172 +0000 (UTC) Date: Wed, 13 Jan 2021 17:35:26 +0000 (UTC) From: zverok.offline@gmail.com Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 77971 X-Redmine-Project: ruby-master X-Redmine-Issue-Tracker: Bug X-Redmine-Issue-Id: 17537 X-Redmine-Issue-Author: akim X-Redmine-Sender: zverok 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?3be0g8093pjUjT94eiCA64csFDBI=2FmHQTWm54P5gda4j+7m5QDL=2FB7ObflQx6M?= =?us-ascii?Q?MPKa65ZRee4Q6psUqHYlr1ju8j7v+REqLNi9oLp?= =?us-ascii?Q?BjTKcj3=2FOi+uk8T5NC+x+cTzenVlFBD6an8jvCV?= =?us-ascii?Q?CMPtDckDHmEKkdCorhBZwImkm4nZYZ62c1Mk4gJ?= =?us-ascii?Q?2RGEKdBRe5+lctqndZacBs7f52JPxaU6dMkEFEt?= =?us-ascii?Q?9HBu3E9WmLGlOMRtI=3D?= To: ruby-core@ruby-lang.org X-Entity-ID: b/2+PoftWZ6GuOu3b0IycA== X-ML-Name: ruby-core X-Mail-Count: 102068 Subject: [ruby-core:102068] [Ruby master Bug#17537] === on ranges of strings is not consistant with include? 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 #17537 has been updated by zverok (Victor Shepelev). It was intentional. Before 2.6, `===` was using `include?` underneath, which had some undesirable consequences: ```ruby case '2.5.2' when '2.5'..'2.6' puts "It is between 2.5 and 2.6" else puts "It is not" end ``` This prints `"It is between 2.6 and 2.6"` in Ruby 2.7, but prints `"It is not"` on 2.5. It seems that "logically" the former is right. So, in Ruby 2.6, `===` [was changed to use `cover?`](https://rubyreferences.github.io/rubychanges/2.6.html#range-uses-cover-instead-of-include) -- but, somehow, not for strings. It was considered an oversight and was [changed in 2.7](https://rubyreferences.github.io/rubychanges/2.7.html#for-string). ```ruby case "6" when "1".."12" # ... ``` ...is somewhat semantically "wrong" (you are expecting to strings being compared by their numeric values), but strings are tricky, and I agree there are many edge cases which can be considered "weird"/"inconsistent", there are several tickets (I don't remember the numbers by heart) complaining about strings being between the range ends, but not in the range's items list, or vice versa. ---------------------------------------- Bug #17537: === on ranges of strings is not consistant with include? https://bugs.ruby-lang.org/issues/17537#change-89929 * Author: akim (Akim Demaille) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin18] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- Hi, In Ruby up to 2.6 both `("1".."12").include?("6")` and `("1".."12") === "6"` were true. In 2.7 and 3.0, `include?` accepts `"6"`, but `===` does not. This was very handy in `case`s. Reading the documentation it is unclear to me whether this change was intentional. ``` $ cat /tmp/foo.rb puts(("1".."12").include?("6")) puts(("1".."12") === "6") p(("1".."12").to_a) $ ruby2.6 /tmp/foo.rb true true ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"] $ ruby2.7 /tmp/foo.rb true false ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"] $ ruby3.0 /tmp/foo.rb true false ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"] ``` Cheers! -- https://bugs.ruby-lang.org/