Project

General

Profile

Actions

Feature #16379

open

Backporting ... to Ruby 2.4 - 2.6 and pass_keywords

Added by Eregon (Benoit Daloze) almost 2 years ago. Updated almost 2 years ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:96018]

Description

I've heard quite a few people saying that backporting ... to Ruby 2.4-2.6 would be a good way to do migration for keyword arguments.
In fact, if we have ... in Ruby 2.4+, I think ... could be the way to do 90%+ of delegation in a backward-compatible way, and would be vastly more elegant than a hidden Hash flag (ruby2_keywords).

What does the Ruby core team think about that?

I think ... works nicely for lexical delegation:

def delegate(...)
  target(...)
end

It can also work for delegating in a separate method by using ... inside a block inside the method accepting ...:
https://eregon.me/blog/2019/11/10/the-delegation-challenge-of-ruby27.html#pass_keywords

def initialize(...)
  @call_later = -> { target(...) }
end

def call
  @call_later.call
end

If we don't want to backport ..., there is also the option to use pass_keywords like so:

pass_keywords def delegate(*args, &block)
  target(*args, &block)
end
pass_keywords def initialize(*args, &block)
  @call_later = -> { target(*args, &block) }
end

def call
  @call_later.call
end

Which can easily work by making pass_keywords a no-op on Ruby <= 2.6 and make *args behave like ... on Ruby 2.7+.


I think both of these are easier to understand than ruby2_keywords, and both don't need to have any performance trade-off on unrelated code (#16188).

I'd like to have the opinion of the core team on this.
It has been suggested multiple times (notably in my blog post on 10 November), but I have not seen any opinion on this tracker about it.

Actions

Also available in: Atom PDF