From: "Eregon (Benoit Daloze)" Date: 2022-03-14T16:08:50+00:00 Subject: [ruby-core:107896] [Ruby master Bug#18632] Struct.new wrongly treats a positional Hash as keyword arguments Issue #18632 has been updated by Eregon (Benoit Daloze). For `Kernel#raise` I found that it's actually important to separate positional and kwargs, because `raise` does have `cause:` kwargs and optional args, and the 1st or 2nd argument can somtimes be a Hash: https://github.com/oracle/truffleruby/issues/2298 You mean rb_scan_args/rb_scan_args_kw correctly separate positional & kwargs, but the rest do not? I think there is nothing we need to do for C functions not accepting kwargs, because then anyway there is no difference. But for C functions taking kwargs they should not mix positional & kwargs and that is worth fixing. ---------------------------------------- Bug #18632: Struct.new wrongly treats a positional Hash as keyword arguments https://bugs.ruby-lang.org/issues/18632#change-96835 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal * ruby -v: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- ``` $ ruby -e 'Struct.new(:a, name: "b")' -e:1:in `new': unknown keyword: :name (ArgumentError) from -e:1:in `
' ^ expected $ ruby -e 'Struct.new(:a, { name: "b" })' -e:1:in `new': unknown keyword: :name (ArgumentError) from -e:1:in `
' ^ wrong ``` It shouldn't be such an error for the 2nd command since it's a positional Hash. It should be a TypeError, like when passing e.g. `nil` instead of the positional Hash. Also: ``` $ ruby -e 'p Struct.new(:a, {}).members' [:a] ``` But it should be an error to pass a positional Hash. I think this is worth fixing, because it basically breaks the separation of positional and keyword arguments for this method. Also Struct.new does take a keyword argument, `keyword_init: true`. -- https://bugs.ruby-lang.org/ Unsubscribe: