Actions
Feature #16806
closedStruct#initialize accepts keyword arguments too by default
    Feature #16806:
    Struct#initialize accepts keyword arguments too by default
  
Description
Proposal¶
Post = Struct.new(:id, :name)
# In addition to this,
Post.new(1, "hello") #=> #<struct Post id=1, name="hello">
# Let the following initialization also work
Post.new(id: 1, name: "hello") #=> #<struct Post id=1, name="hello">
Known incompatibility¶
- 
Post.new(id: 1, name: "hello")will be#<struct Post id=1, name="hello">instead of#<struct Post id={:id=>1, :name=>"hello"}, name=nil>- Struct initialization only using keyword arguments should be warned in Ruby 3.0. This feature should be introduced in Ruby 3.1 or later.
 
 
Edge cases¶
- When keyword arguments and positional arguments are mixed: 
Post.new(1, name: "hello")- This should continue to work like Ruby 2: 
#<struct Post id=1, name={:name="hello"}> 
 - This should continue to work like Ruby 2: 
 - Only keywords are given but they include an invalid member: 
Post.new(foo: "bar")- ArgumentError (unknown keywords: foo)
 
 - When 
keyword_initis used- nil: default behavior. Positional arguments given use positional init. Keyword arguments without positional arguments treated as positional in 3.0 with warning, and treated as keyword init in Ruby 3.1.
 - true: Require keyword init, disallow positional init.
 - false: Treat keywords as positional hash.
 
 
Use cases¶
- Simplify a struct definition where [Feature #11925] is used.
- When we introduced [Feature #11925], @mame (Yusuke Endoh) thought we don't need 
keyword_init: trueonce keyword args are separated (https://docs.google.com/document/d/1XbUbch8_eTqh21FOwj9a_X-ZyJyCBjxkq8rWwfpf5BM/edit#). That's what this ticket is all about.- However, the keyword arguments separation was done differently from what we expected at the moment. So we need to deal with the "Known incompatibility".
 
 - Matz objected to having a new keyword argument (
immutable: true) inStruct.newat https://bugs.ruby-lang.org/issues/16769#note-8. Sokeyword_init: trueseems also against Ruby's design. Now we should be able to skip specifying the option for consistency in the language design. 
 - When we introduced [Feature #11925], @mame (Yusuke Endoh) thought we don't need 
 
Actions