From: matz@... Date: 2021-01-13T06:30:32+00:00 Subject: [ruby-core:102052] [Ruby master Feature#16806] Struct#initialize accepts keyword arguments too by default Issue #16806 has been updated by matz (Yukihiro Matsumoto). I am OK with 3.1 to warn, 3.2 to change. Matz. ---------------------------------------- Feature #16806: Struct#initialize accepts keyword arguments too by default https://bugs.ruby-lang.org/issues/16806#change-89908 * Author: k0kubun (Takashi Kokubun) * Status: Open * Priority: Normal ---------------------------------------- ## 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: