From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-3.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,SPF_PASS,T_DKIM_INVALID,T_RP_MATCHES_RCVD shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 281F81F406 for ; Thu, 14 Dec 2017 06:59:21 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 0727B120A6B; Thu, 14 Dec 2017 15:59:16 +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 76D89120976 for ; Thu, 14 Dec 2017 15:59:12 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=sendgrid.me; h=from:to:references:subject:mime-version:content-type:content-transfer-encoding:list-id; s=smtpapi; bh=BmB3zBHPUuSrsz4bT3tR0zyTAEM=; b=TyPQ2Q+7PdI9a92t3D MC57NK/TJNI91fVh1lI2cBG6Hre/UTq50IqaI2oVv2FdUsArtfKNOL72cm0YmHcC s+yo6XNRcS9kGtakNMbhlWrjOQohmdR6cu917p0C4zplg75xpCgY61bx9ix67Q2Q YieHQzF5K8SJI04fRZbusL9t0= Received: by filter0018p3las1.sendgrid.net with SMTP id filter0018p3las1-27327-5A32213B-11 2017-12-14 06:59:07.392046425 +0000 UTC Received: from herokuapp.com (ec2-54-160-154-11.compute-1.amazonaws.com [54.160.154.11]) by ismtpd0024p1iad2.sendgrid.net (SG) with ESMTP id MsXVOBOiSiGadx27ZqmZ4Q for ; Thu, 14 Dec 2017 06:59:07.046 +0000 (UTC) Date: Thu, 14 Dec 2017 06:59:08 +0000 (UTC) From: mame@ruby-lang.org To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 59404 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 14183 X-Redmine-Issue-Author: mame X-Redmine-Sender: mame 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: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS6f6J/6ZPLsOGUBQLJMnyORIZ9bRbm4d9cl6w p6xb4PvO/9pyF9UB/r+P2LZPIEkHbGCoCWmsJQfDGFZVVFoYIBVp2+uPy7wdbXnACXKzSGzKWPSk7X tavcBvfVx9ZV+Ec0zWZRufpXExQd81H0tpJ0kFPZUziqXySiYEGdy9xBuQ== X-ML-Name: ruby-core X-Mail-Count: 84255 Subject: [ruby-core:84255] [Ruby trunk Bug#14183] "Real" keyword argument 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 #14183 has been reported by mame (Yusuke Endoh). ---------------------------------------- Bug #14183: "Real" keyword argument https://bugs.ruby-lang.org/issues/14183 * Author: mame (Yusuke Endoh) * Status: Open * Priority: Normal * Assignee: * Target version: Next Major * ruby -v: * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- In RubyWorld Conference 2017 and RubyConf 2017, Matz officially said that Ruby 3.0 will have "real" keyword arguments. AFAIK there is no ticket about it, so I'm creating this (based on my understanding). In Ruby 2, the keyword argument is a normal argument that is a Hash object (whose keys are all symbols) and is passed as the last argument. This design is chosen because of compatibility, but it is fairly complex, and has been a source of many corner cases where the behavior is not intuitive. (Some related tickets: #8040, #8316, #9898, #10856, #11236, #11967, #12104, #12717, #12821, #13336, #13647, #14130) In Ruby 3, a keyword argument will be completely separated from normal arguments. (Like a block parameter that is also completely separated from normal arguments.) This change will break compatibility; if you want to pass or accept keyword argument, you always need to use bare `sym: val` or double-splat `**` syntax: ``` # The following calls pass keyword arguments foo(..., key: val) foo(..., **hsh) foo(..., key: val, **hsh) # The following calls pass **normal** arguments foo(..., {key: val}) foo(..., hsh) foo(..., {key: val, **hsh}) # The following method definitions accept keyword argument def foo(..., key: val) end def foo(..., **hsh) end # The following method definitions accept **normal** argument def foo(..., hsh) end ``` I think here is a transition path: * Ruby 2.6 (or 2.7?) will output a warning when a normal argument is interpreted as keyword argument, or vice versa. * Ruby 3.0 will use the new semantics. -- https://bugs.ruby-lang.org/