Я заметил, что я нахожу очень удивительным поведение с оператором **
(double-splat) в 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 }
Для сравнения рассмотрим поведение оператора single- *
на массивах:
a = [2]
[1, *a] # => [1, 2]
a # => [2]
[1, *a, 3] # => [1, 2, 3]
a # => [2]
[*a, 3] # => [2, 3]
a # => [2]
Массив остается неизменным во всем.
Предположим, что иногда деструктивное поведение **
является преднамеренным, или оно больше похоже на ошибку?
В любом случае, где находится документация, описывающая, как должен работать оператор **
?
Я также задал этот вопрос в Ruby Forum.
UPDATE
Исправлена ошибка в Ruby 2.1.3 +.