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=-0.5 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS 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 7BEDD1F463 for ; Wed, 11 Dec 2019 14:16:20 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id F3417120977; Wed, 11 Dec 2019 23:16:06 +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 4C5AA120929 for ; Wed, 11 Dec 2019 23:16:04 +0900 (JST) Received: by filter0150p3mdw1.sendgrid.net with SMTP id filter0150p3mdw1-16459-5DF0FA29-10 2019-12-11 14:16:09.15031548 +0000 UTC m=+1866266.952102538 Received: from herokuapp.com (unknown [52.207.12.188]) by ismtpd0029p1mdw1.sendgrid.net (SG) with ESMTP id TlR8es06R-23Kq0VgxorjQ for ; Wed, 11 Dec 2019 14:16:08.978 +0000 (UTC) Date: Wed, 11 Dec 2019 14:16:09 +0000 (UTC) From: daniel@dan42.com Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 71853 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 14183 X-Redmine-Issue-Author: mame X-Redmine-Sender: Dan0042 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?8sy4RigFvRTdBfCVJrT9zb2J88PC92TMQwdNgaWYaq65AIzeUTMvNKDvpCB5aY?= =?us-ascii?Q?J+aHvF+vQZwVMClICj6D5rIdBO3nfep4q5LXse+?= =?us-ascii?Q?imky7X9Xnem2d=2Fh5qTSzEPxFf8HGUnXXoVH2vHM?= =?us-ascii?Q?+JKACpi99kqGZJNm7Ulkgnig5Me8um+GbZaGO8L?= =?us-ascii?Q?QPAMQoe2hQiQYsLygK7IvKxhpJU=2FOQZNqMw=3D=3D?= To: ruby-core@ruby-lang.org X-ML-Name: ruby-core X-Mail-Count: 96201 Subject: [ruby-core:96201] [Ruby master Feature#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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #14183 has been updated by Dan0042 (Daniel DeLorme). This can be solved by refactoring, but yeah it's much more complicated than= just adding `**` to the appropriate places :-( ```ruby def do_something(*args, &block) yield 'yield_self', {expected: 'then'} end def print_something(code, expected:, use: expected, instead_of: code) puts "code: =A0 =A0 =A0 #{code}" puts "expected: =A0 #{expected}" puts "use: =A0 =A0 =A0 =A0#{use}" puts "instead_of: #{instead_of}" end do_something do |code, h| print_something(code, **h) end ``` ---------------------------------------- Feature #14183: "Real" keyword argument https://bugs.ruby-lang.org/issues/14183#change-83089 * Author: mame (Yusuke Endoh) * Status: Closed * Priority: Normal * Assignee: = * Target version: Next Major ---------------------------------------- In RubyWorld Conference 2017 and RubyConf 2017, Matz officially said that R= uby 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 desi= gn is chosen because of compatibility, but it is fairly complex, and has be= en a source of many corner cases where the behavior is not intuitive. (Som= e related tickets: #8040, #8316, #9898, #10856, #11236, #11967, #12104, #12= 717, #12821, #13336, #13647, #14130) In Ruby 3, a keyword argument will be completely separated from normal argu= ments. (Like a block parameter that is also completely separated from norm= al 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 `**` synt= ax: ``` # 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 ``` In other words, the following programs WILL NOT work: ``` # This will cause an ArgumentError because the method foo does not accept k= eyword argument def foo(a, b, c, hsh) p hsh[:key] end foo(1, 2, 3, key: 42) # The following will work; you need to use keyword rest operator explicitly def foo(a, b, c, **hsh) p hsh[:key] end foo(1, 2, 3, key: 42) # This will cause an ArgumentError because the method call does not pass ke= yword argument def foo(a, b, c, key: 1) end h =3D {key: 42} foo(1, 2, 3, h) # The following will work; you need to use keyword rest operator explicitly def foo(a, b, c, key: 1) end h =3D {key: 42} foo(1, 2, 3, **h) ``` I think here is a transition path: * Ruby 2.6 (or 2.7?) will output a warning when a normal argument is interp= reted as keyword argument, or vice versa. * Ruby 3.0 will use the new semantics. ---Files-------------------------------- vm_args.diff (4.19 KB) vm_args_v2.diff (4.18 KB) -- = https://bugs.ruby-lang.org/ Unsubscribe: