From: takashikkbn@... Date: 2021-01-19T00:05:11+00:00 Subject: [ruby-core:102147] [Ruby master Feature#16806] Struct#initialize accepts keyword arguments too by default Issue #16806 has been updated by k0kubun (Takashi Kokubun). Assignee set to k0kubun (Takashi Kokubun) Status changed from Closed to Assigned ---------------------------------------- Feature #16806: Struct#initialize accepts keyword arguments too by default https://bugs.ruby-lang.org/issues/16806#change-89999 * Author: k0kubun (Takashi Kokubun) * Status: Assigned * Priority: Normal * Assignee: k0kubun (Takashi Kokubun) ---------------------------------------- ## Proposal ```rb Post = Struct.new(:id, :name) # In addition to this, Post.new(1, "hello") #=> # # Let the following initialization also work Post.new(id: 1, name: "hello") #=> # ``` ### Known incompatibility * `Post.new(id: 1, name: "hello")` will be `#` instead of `#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: `#` * 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 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`) in `Struct.new` at https://bugs.ruby-lang.org/issues/16769#note-8. So `keyword_init: true` seems also against Ruby's design. Now we should be able to skip specifying the option for consistency in the language design. -- https://bugs.ruby-lang.org/ Unsubscribe: