Actions
Feature #16806
closedStruct#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_init
is 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: true
once 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.new
at https://bugs.ruby-lang.org/issues/16769#note-8. Sokeyword_init: true
seems 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
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0