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-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-3.8 required=3.0 tests=BAYES_00, 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 618C41F4B4 for ; Sat, 10 Apr 2021 20:45:46 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 000A2120E03; Sun, 11 Apr 2021 05:44:43 +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 BC6F2120D9B for ; Sun, 11 Apr 2021 05:44:41 +0900 (JST) Received: by filterdrecv-c5749c756-4qckc with SMTP id filterdrecv-c5749c756-4qckc-14-60720E6F-16 2021-04-10 20:45:35.164112048 +0000 UTC m=+1395708.057002302 Received: from herokuapp.com (unknown) by ismtpd0191p1mdw1.sendgrid.net (SG) with ESMTP id lWBksNTLQKWfKb7CGwbXmg for ; Sat, 10 Apr 2021 20:45:35.108 +0000 (UTC) Date: Sat, 10 Apr 2021 20:45:35 +0000 (UTC) From: fxn@hashref.com Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 79429 X-Redmine-Project: ruby-master X-Redmine-Issue-Tracker: Feature X-Redmine-Issue-Id: 17753 X-Redmine-Issue-Author: tenderlovemaking X-Redmine-Sender: fxn 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?nBqvi0=2FX0JUE4l3AKfUjuwxdcsxPcgQmSMOE0TmEhKfbNjgOauAjjcihtgRPoT?= =?us-ascii?Q?GEaOiOltEh72dpNvbn3FLJKrFoHgoRbYT8ZZKuW?= =?us-ascii?Q?DQkhPw4TQUqvfH38Y2nTbucrVvE721KQMBLNPYH?= =?us-ascii?Q?yURPauHnw0ziJA7qyIib6mMvCXJNwc9yMDE3ZBZ?= =?us-ascii?Q?9gPmukdnIBMczpGazEBJ3=2FQuSwBsGhqEJHg=3D=3D?= To: ruby-core@ruby-lang.org X-Entity-ID: b/2+PoftWZ6GuOu3b0IycA== X-ML-Name: ruby-core X-Mail-Count: 103382 Subject: [ruby-core:103382] [Ruby master Feature#17753] Add Module#namespace 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 #17753 has been updated by fxn (Xavier Noria). Also, in case my comments above are too genric, let's take the use case in the description of the ticket: > I can do A::B::C.outer_scope.constants to find the list of "sibling" constants to C. Let's consider ```ruby module A module B class C; end class D; end end end module X Y = A::B::C Z = 1 end ``` In what sense is `A::B::D` a sibling of `A::B::C` and `X::Z` is not? If our input is a class object, as in the `ObjectSpace` example, you have no information that allows you to jump from it to its possibly multiple places in which the object may be stored. And the original constant may be gone, those places can be elsewhere (as it happens with stale class objects cached during Rails initialization after a reload). On the other hand, if you are in a very specific situation where you can assume that loop makes sense for all `k`, you can always `name.sub(/::\w+$/, '')` and `const_get`, modulus details. In a project, in a library, you may have constraints in place that you can exploit. In Ruby, the language, you don't. ---------------------------------------- Feature #17753: Add Module#namespace https://bugs.ruby-lang.org/issues/17753#change-91475 * Author: tenderlovemaking (Aaron Patterson) * Status: Open * Priority: Normal ---------------------------------------- Given code like this: ```ruby module A module B class C; end class D; end end end ``` We can get from `C` to `B` like `C.outer_scope`, or to `A` like `C.outer_scope.outer_scope`. I want to use this in cases where I don't know the outer scope, but I want to find constants that are "siblings" of a constant. For example, I can do `A::B::C.outer_scope.constants` to find the list of "sibling" constants to `C`. I want to use this feature when walking objects and introspecting. For example: ```ruby ObjectSpace.each_object(Class) do |k| p siblings: k.outer_scope.constants end ``` I've attached a patch that implements this feature, and there is a pull request on GitHub [here](https://github.com/ruby/ruby/pull/4326). ---Files-------------------------------- 0001-Add-Module-outer_scope.patch (5.93 KB) 0001-Add-Module-namespace.patch (5.89 KB) -- https://bugs.ruby-lang.org/