Issue #11027 has been updated by Nobuyoshi Nakada.

Description updated

Marshal is not mandatory.

It can reproduce with a dynamic symbol keyword argument.

~~~ruby
ack(i_field1:"field1", i_field2:"field2", "something".intern=>"something")
~~~


----------------------------------------
Bug #11027: Named Argument assignment from Hash failure
https://bugs.ruby-lang.org/issues/11027#change-52018

* Author: Alan Gano
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
I am call a method, which has named arguments, a Hash, which then as expected, maps the keys of the Hash to the argument names.

I boiled down a problem scenario wherein it fails to do this.  In the code below the argument i_field2 of the ack() method, is failing to be set from the Hash.  It gets set to nil.

This also occurs in 2.2.0p0.

~~~ruby
require 'base64'

def ack(i_field1:,i_field2:,**i_others)
   puts '-'*79
   puts i_field1.inspect
   puts ">>> #{i_field2.inspect} <<< SHOULD be 'field2'"
   puts i_others.inspect
end

# create the marshaled hash in another execution
#t_args = {i_field1:"field1",i_field2:"field2",something:"something"}
#puts Base64.strict_encode64(Marshal.dump(t_args))
#exit

t_marshal = 'BAh7CDoNaV9maWVsZDFJIgtmaWVsZDEGOgZFVDoNaV9maWVsZDJJIgtmaWVsZDIGOwZUOg5zb21ldGhpbmdJIg5zb21ldGhpbmcGOwZU'

t_args = Marshal.load(Base64.strict_decode64(t_marshal))

puts t_args.inspect
# => {:i_field1=>"field1", :i_field2=>"field2", :something=>"something"}

ack(t_args)

#_ = { something:'?' }         # makes it work
#_ = { :something => '?' }     # makes it work
#_ = :something                # makes it work
~~~





-- 
https://bugs.ruby-lang.org/