Project

General

Profile

Actions

Bug #9898

closed

Keyword argument oddities

Added by brixen (Brian Shirai) almost 7 years ago. Updated over 6 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
[ruby-core:62921]

Description

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:

# 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:

# 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?


Related issues

Related to Ruby master - Feature #14183: "Real" keyword argumentClosedActions
Has duplicate Ruby master - Bug #9954: Unexpected Hash Modification and Segmentation Fault with Named ArgumentsClosed06/18/2014Actions
Actions

Also available in: Atom PDF