Project

General

Profile

Bug #11860

Double splat does not work on empty hash assigned via variable

Added by sawa (Tsuyoshi Sawada) over 3 years ago. Updated 3 months ago.

Status:
Open
Priority:
Normal
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)

History

Updated by sawa (Tsuyoshi Sawada) over 3 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 3 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 3 years ago

This bug is related to #10708.

Updated by nobu (Nobuyoshi Nakada) about 3 years ago

  • Description updated (diff)
#5

Updated by sawa (Tsuyoshi Sawada) 3 months ago

  • Description updated (diff)

Also available in: Atom PDF