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.6 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,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 241D61F463 for ; Fri, 13 Sep 2019 17:54:32 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id C6A63120A28; Sat, 14 Sep 2019 02:54:21 +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 CF1BC120A0F for ; Sat, 14 Sep 2019 02:54:19 +0900 (JST) Received: by filter0181p3mdw1.sendgrid.net with SMTP id filter0181p3mdw1-4087-5D7BD7CD-A 2019-09-13 17:54:21.151484084 +0000 UTC m=+70854.259656131 Received: from herokuapp.com (unknown [54.242.69.183]) by ismtpd0027p1mdw1.sendgrid.net (SG) with ESMTP id hhKF1q63SpiufRnzLccWTA for ; Fri, 13 Sep 2019 17:54:21.094 +0000 (UTC) Date: Fri, 13 Sep 2019 17:54:21 +0000 (UTC) From: merch-redmine@jeremyevans.net Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 70487 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 16157 X-Redmine-Issue-Author: Dan0042 X-Redmine-Sender: jeremyevans0 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?RVE3t853K5scBhbmJHUzZTFFeVC=2FZSUmHZ0Dc+26wcEi2CTgsF1oz0wTSSxGGN?= =?us-ascii?Q?BIKZF5vOTFRq7=2FLjkQi28s+XlpvsUYchMFSbOj7?= =?us-ascii?Q?NQk3GnY16g1dsZ+qBKDovh+sdH1s=2FmmCW5=2F8qJS?= =?us-ascii?Q?WpWRzqcM+EaByflKKJaOSaY1LkL=2F2jETPRhxJ66?= =?us-ascii?Q?Ed1UYFFwlnQUYogj=2F=2Fv=2FCxWMuCkXX++xDMg=3D=3D?= To: ruby-core@ruby-lang.org X-ML-Name: ruby-core X-Mail-Count: 94933 Subject: [ruby-core:94933] [Ruby master Misc#16157] What is the correct and *portable* way to do generic delegation? 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 #16157 has been updated by jeremyevans0 (Jeremy Evans). Dan0042 (Daniel DeLorme) wrote: > In that case I'd like to make one last suggestion. > = > For a method with `*args`, if the method is called with keyword arguments= , flag `args` in some way (instance variable?) so that, in that method only= , a call with `*args` would result in the last argument being passed as a k= eyword argument. Yes, it's a hack, but it's a better hack than `pass_keywor= ds` imho. You can't make this an instance-specific flag and easily contain the scope = to that method only. The user could pass `args` (not `*args`) as a argumen= t to another method and splat `args` in that method. Also, using an instance-specific flag doesn't handle this type of delegatio= n: ```ruby def foo(*args) bar(*args.map{|arg| something(arg)}) end ``` > This would make the migration less tedious, less confusing, less error-pr= one, and postpone this whole delegation mess to a date when it's easier to = deal with. I really think this migration should be split into "should be do= ne now" and "easier to do once 2.6 is no longer supported". My 2=A2 The approach you are proposing handles the simplest case fine and opens ano= ther Pandora's box of issues for other cases. And if you want to split the= migration into "should be done now" vs. "easier to do once 2.6 is no longe= r supported", that's exactly what `pass_keywords` allows. You can use `pas= s_keywords` now, and once 2.6 is no longer supported, you can switch all de= legation to `(*args, **kw)`. ---------------------------------------- Misc #16157: What is the correct and *portable* way to do generic delegatio= n? https://bugs.ruby-lang.org/issues/16157#change-81548 * Author: Dan0042 (Daniel DeLorme) * Status: Open * Priority: Normal * Assignee: = ---------------------------------------- With the keyword argument changes in 2.7 we must now specify keyword argume= nts explicitly when doing generic delegation. But this change is not compat= ible with 2.6, where it adds an empty hash to the argument list of methods = that do not need/accept keyword arguments. To illustrate the problem: ```ruby class ProxyWithoutKW < BasicObject def initialize(target) @target =3D target end def method_missing(*a, &b) @target.send(*a, &b) end end class ProxyWithKW < BasicObject def initialize(target) @target =3D target end def method_missing(*a, **o, &b) @target.send(*a, **o, &b) end end class Test def args(*a) a end def arg(a) a end def opts(**o) o end end # 2.6 2.7 3.0 ProxyWithoutKW.new(Test.new).args(42) # [42] [42] [42= ] ok ProxyWithoutKW.new(Test.new).arg(42) # 42 42 42 = ok ProxyWithoutKW.new(Test.new).opts(k: 42) # {:k=3D>42} {:k=3D>42} +warn = [{:k=3D>42}] incompatible with >=3D 2.7 ProxyWithKW.new(Test.new).args(42) # [42, {}] [42] [42= ] incompatible with <=3D 2.6 ProxyWithKW.new(Test.new).arg(42) # error 42 42 = incompatible with <=3D 2.6 ProxyWithKW.new(Test.new).opts(k: 42) # {:k=3D>42} {:k=3D>42} +warn = {:k=3D>42} must ignore warning? cannot use pass_positional_hash in 2.6 ``` I don't know how to solve this, so I'm asking for the **official** correct = way to write portable delegation code. And by **portable** I mean code that= can be used in gems that target ruby 2.6 and above. -- = https://bugs.ruby-lang.org/ Unsubscribe: