
Issue #20218 has been updated by Eregon (Benoit Daloze). Eregon (Benoit Daloze) wrote in #note-14:
A workaround is to use `IndexTest.[]=('foo', { namespace: 'bar' }, 2)` instead.
Ah there is actually a much simpler change: ```ruby # original: IndexTest['foo', namespace: 'bar'] = 2 # This works instead on ruby-master: IndexTest['foo', { namespace: 'bar' }] = 2 ``` I think if we could mention what to change in the SyntaxError it would be a big help. Currently: ``` ruby 3.4.0dev (2024-05-30T12:13:10Z master 78bfde5d9f) [x86_64-linux] index-test.rb: index-test.rb:28: keyword arg given in index (SyntaxError) ...dexTest['foo', namespace: 'bar'] = 2 ... ^~~~~~~~~~~~~~~~ ``` ---------------------------------------- Bug #20218: aset/masgn/op_asgn with keyword arguments https://bugs.ruby-lang.org/issues/20218#change-108529 * Author: jeremyevans0 (Jeremy Evans) * Status: Closed * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I found that use of keyword arguments in multiple assignment is broken in 3.3 and master: ```ruby h = {a: 1} o = [] def o.[]=(*args, **kw) replace([args, kw]) end # This segfaults as RHS argument is not a hash o[1, a: 1], _ = [1, 2] # This passes the RHS argument as keywords to the method, treating keyword splat as positional argument o[1, **h], _ = [{b: 3}, 2] o # => [[1, {:a=>1}], {:b=>3}] ``` Before 3.3, keyword arguments were treated as positional arguments. This is similar to #19918, but for keyword arguments instead of block arguments. @matz indicated he wanted to prohibit block arguments in aset/masgn and presumably also op_asgn (making them SyntaxErrors). Can we also prohibit keyword arguments in aset/masgn/op_asgn? Note that aset treats keyword arguments as regular arguments: ```ruby o[1, a: 1] = 2 o # => [[1, {:a=>1}, 2], {}] o[1, **h] = {b: 3} o # => [[1, {:a=>2}, {:b=>3}], {}] ``` While op_asgn treats keyword arguments as keywords: ```ruby h = {a: 2} o = [] def o.[](*args, **kw) concat([:[], args, kw]) x = Object.new def x.+(v) [:x, v] end x end def o.[]=(*args, **kw) concat([:[]=, args, kw]) end o[1, a: 1] += 2 o # => [:[], [1], {:a=>1}, :[]=, [1, [:x, 2]], {:a=>1}] o.clear o[1, **h] += {b: 3} o # => [:[], [1], {:a=>2}, :[]=, [1, [:x, {:b=>3}]], {:a=>2}] ``` -- https://bugs.ruby-lang.org/