From: merch-redmine@... Date: 2020-04-20T14:05:26+00:00 Subject: [ruby-core:97977] [Ruby master Feature#16801] The default Struct constructor improperly handle keyword arguments Issue #16801 has been updated by jeremyevans0 (Jeremy Evans). Backport deleted (2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN) ruby -v deleted (ruby 2.7.1p83) Tracker changed from Bug to Feature I think the something your missing is this would break existing code: ```ruby Struct.new(:hash_value).new(hash_key: 1) ``` Treating the keywords as named columns when they were originally designed to be a hash value for the next column will definitely break existing code. That is why `keyword_init` must be specified explicitly. The current design is expected and not a bug. Switching this to a feature request. ---------------------------------------- Feature #16801: The default Struct constructor improperly handle keyword arguments https://bugs.ruby-lang.org/issues/16801#change-85206 * Author: byroot (Jean Boussier) * Status: Open * Priority: Normal ---------------------------------------- Reproduction script: ```ruby Field = Struct.new(:value) do def initialize(value, keyword: false) super(value) @keyword = keyword end end Field.new(1, keyword: true) ``` ``` /tmp/kw.rb:8: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call /tmp/kw.rb:2: warning: The called method `initialize' is defined here ``` This can be worked around with `keyword_init: true`, but I see no reason why `Struct` couldn't properly handle keyword arguments in it's default constructor. I have a patch for this: https://github.com/ruby/ruby/pull/3045 however I had to modify a test that was explicitly expecting that warning, so maybe I'm missing something. -- https://bugs.ruby-lang.org/ Unsubscribe: