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=-4.1 required=3.0 tests=AWL,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS 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 DBA8E1F4C0 for ; Wed, 23 Oct 2019 09:16:12 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 8E1CB120A87; Wed, 23 Oct 2019 18:16:03 +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 AF9AC12091D for ; Wed, 23 Oct 2019 18:16:00 +0900 (JST) Received: by filter0148p3mdw1.sendgrid.net with SMTP id filter0148p3mdw1-28553-5DB01A54-E 2019-10-23 09:16:04.099834387 +0000 UTC m=+124815.435450821 Received: from herokuapp.com (unknown [52.91.158.104]) by ismtpd0068p1iad1.sendgrid.net (SG) with ESMTP id IEUb5blCQTGiHrJBDaYgTw for ; Wed, 23 Oct 2019 09:16:04.091 +0000 (UTC) Date: Wed, 23 Oct 2019 09:16:04 +0000 (UTC) From: shyouhei@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 71089 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 16274 X-Redmine-Issue-Author: sawa X-Redmine-Sender: shyouhei 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?jcfQDMoo=2FMGCmP3uu1SeyLQUxUPXq5PjHpHz3xSFn14Yulm8=2F96BRFGZG3uw0h?= =?us-ascii?Q?wcGxPN9zVjsweox5rYYQ24dd1DuwfN6u7WFMiGY?= =?us-ascii?Q?Mn0r2XMOzr8ff1ESX+uPKnCk+ToSaCvLICdKzfp?= =?us-ascii?Q?A4ZxleBEEB8v6+Z55QZ283j5L2CaGFGgNuohNvA?= =?us-ascii?Q?2VCtPBtzg47esF3Tif9PYBqYfSBCPPB4tBQ=3D=3D?= To: ruby-core@ruby-lang.org X-ML-Name: ruby-core X-Mail-Count: 95497 Subject: [ruby-core:95497] [Ruby master Feature#16274] Transform hash keys by a hash 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 #16274 has been updated by shyouhei (Shyouhei Urabe). Understand the motivation (maybe that of #slice can be separated into another request). One quick question: what should happen if _both_ a block and an argument are passed at once? ---------------------------------------- Feature #16274: Transform hash keys by a hash https://bugs.ruby-lang.org/issues/16274#change-82271 * Author: sawa (Tsuyoshi Sawada) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- We have `Hash#transform_keys` and its bang version to change the keys of a hash, but that requires passing a block, which assumes that the mapping from old keys to new keys follow some rule. But in reality, we frequently want to change the keys where it is difficult to provide a rule. For example, suppose we have: ``` hash = {created: 2019-10-23 17:54:46 +0900, updated: 2019-10-23 17:59:18 +0900, author: "foo"} ``` and want to achieve: ``` {created_at: 2019-10-23 17:54:46 +0900, update_time: 2019-10-23 17:59:18 +0900, author: "foo"} ``` I request an option to change the keys of a hash not by giving a block, but by passing a hash. I came up with two options. ### 1. Argument for `Hash#transform_keys` and its bang version Allow `Hash#transform_keys` to optionally take a hash argument instead of a block. ``` hash.transform_keys({created: :created_at, updated: :update_time}) # => {created_at: 2019-10-23 17:54:46 +0900, update_time: 2019-10-23 17:59:18 +0900, author: "foo"} ``` ### 2. Argument for `Hash#slice` and the counterparts in other classes Since `Hash#slice` is often the first step of modifying a hash into some other hash form, it makes sense to let it take an optional hash argument. ``` hash.slice(:created, :author, transform_keys: {created: :created_at}) # => {created_at: 2019-10-23 17:54:46 +0900, author: "foo"} ``` -- https://bugs.ruby-lang.org/