Issue #12884 has been updated by Shyouhei Urabe.


(Just to be clear) It has nothing to do with HWIA.  I can reproduce the situation without it.

```ruby
class X < Hash; end

def test(params = X.new, disrupter: nil)
  return params
end

x = X.new
x['foo'] = 'bar'
p test(x).class
```

----------------------------------------
Bug #12884: Using a HashWithIndifferentAccess with a default value in a function with a keyword parameter converts it to a Hash.
https://bugs.ruby-lang.org/issues/12884#change-61128

* Author: Mathieu Derelle
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: 2.3.1
* Backport: 2.1: DONTNEED, 2.2: REQUIRED, 2.3: REQUIRED
----------------------------------------
A strange bug that broke our production when migrating from 2.1.9 to 2.2.5 (still present in 2.3.1)
It involves HashWithIndifferentAccess from active support. The version used is 3.2.22.4 (against all ruby versions)

Here's a bit of code to reproduce it :

~~~ ruby
def test(params = HashWithIndifferentAccess.new, disrupter: nil)
	params.class
end

x = HashWithIndifferentAccess.new
x[:foo] = 'bar'
test x
# 2.3.1 => Hash
# 2.2.5 => Hash
# 2.1.9 => HashWithIndifferentAccess
~~~

But this only happens if there is a keyword parameter AND a default value for your HashWithIndifferentAccess parameter :

Not using a keyword parameter doesn't change the type

~~~ ruby
def test(params = HashWithIndifferentAccess.new, disrupter = nil)
	params.class
end

x = HashWithIndifferentAccess.new
x[:foo] = 'bar'
test x
# 2.3.1 => HashWithIndifferentAccess
# 2.2.5 => HashWithIndifferentAccess
# 2.1.9 => HashWithIndifferentAccess
~~~

Not using a default value don't change the type

~~~ ruby
def test(params, disrupter: nil)
	params.class
end

x = HashWithIndifferentAccess.new
x[:foo] = 'bar'
test x
# 2.3.1 => HashWithIndifferentAccess
# 2.2.5 => HashWithIndifferentAccess
# 2.1.9 => HashWithIndifferentAccess
~~~




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>