El operador de doble splat modifica destructivamente el hash: ¿es esto un error de Ruby?
Me di cuenta de lo que encuentro un comportamiento muy sorprendente con el**
operador (doble splat) en Ruby 2.1.1.
Cuando se usan pares clave-valor antes de un**hash
, el hash permanece sin modificar; sin embargo, cuando los pares clave-valor solo se usan después de**hash
, el hash se modifica permanentemente.
h = { b: 2 }
{ a: 1, **h } # => { a: 1, b: 2 }
h # => { b: 2 }
{ a: 1, **h, c: 3 } # => { a: 1, b: 2, c: 3 }
h # => { b: 2 }
{ **h, c: 3 } # => { b: 2, c: 3 }
h # => { b: 2, c: 3 }
A modo de comparación, considere el comportamiento del single-*
operador en matrices:
a = [2]
[1, *a] # => [1, 2]
a # => [2]
[1, *a, 3] # => [1, 2, 3]
a # => [2]
[*a, 3] # => [2, 3]
a # => [2]
La matriz permanece sin cambios en todo momento.
¿Suponemos el comportamiento a veces destructivo de**
es intencional, o se parece más a un error?
En cualquier caso, ¿dónde está la documentación que describe cómo**
operador debe trabajar?
También hice esta preguntaen el foro Ruby.
ACTUALIZAR
El error se corrigió en Ruby 2.1.3+.