Оператор двойных сплатов деструктивно модифицирует хеш - это ошибка Ruby?
Я заметил очень удивительное поведение с**
(двойной сплат) оператор в Ruby 2.1.1.
Когда пары ключ-значение используются перед**hash
хеш остается неизменным; однако, когда пары ключ-значение используются только после**hash
хэш постоянно изменяется.
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 = [2]
[1, *a] # => [1, 2]
a # => [2]
[1, *a, 3] # => [1, 2, 3]
a # => [2]
[*a, 3] # => [2, 3]
a # => [2]
Массив остается неизменным повсюду.
Предполагаем ли мы иногда разрушительное поведение**
является преднамеренным, или это больше похоже на ошибку?
В любом случае, где находится документация, описывающая, как**
оператор предназначен для работы?
Я тоже задавал этот вопросв Рубиновом форуме.
ОБНОВИТЬ
Ошибка исправлена в Ruby 2.1.3+.