From: andrew@... Date: 2016-01-31T05:43:45+00:00 Subject: [ruby-core:73616] [Ruby trunk - Bug #11993] foo(hash) is handled like foo(**hash) Issue #11993 has been updated by Andrew Vit. See #11967 for Marc-Andre's explanation. ---------------------------------------- Bug #11993: foo(hash) is handled like foo(**hash) https://bugs.ruby-lang.org/issues/11993#change-56812 * Author: Stefan Sch����ler * Status: Open * Priority: Normal * Assignee: * ruby -v: 2.3.0 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- Given this method: def foo(a = nil, b: nil) p a: a, b: b end I can pass keyword arguments to it and I can turn a hash into keyword arguments with the `**` operator: foo(b: 1) #=> {:a=>nil, :b=>1} foo(**{b: 1}) #=> {:a=>nil, :b=>1} What baffles me is that a hash is also turned into keyword arguments *without* the `**` operator: foo({b: 1}) #=> {:a=>nil, :b=>1} This looks like a flaw to me. I was expecting: foo({b: 1}) #=> {:a=>{:b=>1}, :b=>nil} Which would have resembled the way `*` works: def bar(a = nil, b = nil) p a: a, b: b end bar(1, 2) #=> {:a=>1, :b=>2} bar(*[1, 2]) #=> {:a=>1, :b=>2} bar([1, 2]) #=> {:a=>[1, 2], :b=>nil} But currently, there doesn't seem to be a difference between `foo(hash)` and `foo(**hash)`. Is this behavior intended? If so, what's the rationale behind this decision? -- https://bugs.ruby-lang.org/ Unsubscribe: