Project

General

Profile

Actions

Bug #11860

closed

Double splat does not work on empty hash assigned via variable

Added by sawa (Tsuyoshi Sawada) almost 9 years ago. Updated about 5 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
2.3.0preview2 (2015-12-11 trunk 53028) [x86_64-linux]
[ruby-core:72429]

Description

When an empty hash is given as a literal, the double splat operates on it, and leaves nothing, which is expected.

class String
  def foo; end
end

[**{}] # => []
"foo".foo(**{}) # => nil
"foo".send("foo", **{}) # => nil

However, when an empty hash is given via variable, the double splat retains an empty hash in place.

h = {}

[**h] # => [{}]
"foo".foo(**h) # => wrong number of arguments (given 1, expected 0)
"foo".send("foo", **h) # => wrong number of arguments (given 1, expected 0)

Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #14183: "Real" keyword argumentClosedActions

Updated by sawa (Tsuyoshi Sawada) almost 9 years ago

I found more cases (other than via variable) that the double splat does not work on an empty hash. While parenthesis or nesting does not cause the issue:

[**({})] # => []
[**begin {} end] # => []
[**{**{}}] # => []

more complicated expressions seem to cause the issue:

[**({} if true)] # => [{}]
[**(if true; {} end)] # => [{}]
[**(false ? :foo : {})] # => [{}]

Updated by justcolin (Colin Fulton) over 8 years ago

A similar bug happens when using the double splat operator in the parameter list of a method definition. See #12022.

Updated by sawa (Tsuyoshi Sawada) over 8 years ago

This bug is related to #10708.

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

  • Description updated (diff)
Actions #5

Updated by sawa (Tsuyoshi Sawada) over 5 years ago

  • Description updated (diff)
Actions #6

Updated by jeremyevans0 (Jeremy Evans) over 5 years ago

Updated by jeremyevans0 (Jeremy Evans) about 5 years ago

  • Status changed from Open to Closed

With recent commits to the master branch, keyword splats of empty hashes do not pass positional arguments to methods or cause an empty hash to be added to an array.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0