From: nobu@... Date: 2014-06-03T19:08:50+00:00 Subject: [ruby-core:62925] [ruby-trunk - Bug #9898] [Closed] Keyword argument oddities 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/