Issue #9898 has been updated by Nobuyoshi Nakada.

Status changed from Open to Closed
% Done changed from 0 to 100

Applied in changeset r46342.

----------
vm.c: return the result hash

* vm.c (core_hash_merge_kwd): should return the result hash, which
  may be converted from and differ from the given argument.
  [ruby-core:62921] [Bug #9898]

----------------------------------------
Bug #9898: Keyword argument oddities
https://bugs.ruby-lang.org/issues/9898#change-47028

* Author: Brian Shirai
* Status: Closed
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
* Backport: 2.0.0: DONTNEED, 2.1: REQUIRED
----------------------------------------
Case 1: If a method takes a single argument, and the method is called with a keyword splat, the method receives the passed object, not the result of calling `#to_hash` on the object:

~~~ruby
# kw1.rb
def m(a) a end
o = Object.new
def o.to_hash() puts "to_hash"; { a: 1 } end
p m(**o)
~~~

~~~
$ ruby -v kw1.rb
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
to_hash
#<Object:0x007fdee188ab90>
~~~

Would someone please explain why the result of `#to_hash` in not passed to the method?


Case 2: If the method takes a keyword argument, `#to_hash` is called at the send site and at the receiver:

~~~ruby
# kw2.rb
def mk(a:) a end
o = Object.new
def o.to_hash() puts "to_hash"; { a: 1 } end
p mk(**o)
~~~

~~~
$ ruby -v kw2.rb
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
to_hash
to_hash
1
~~~

Would someone please explain why `#to_hash` is called at both the send site and at the receiver?





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