Ho notato che trovo un comportamento molto sorprendente con l'operatore **
(double-splat) in Ruby 2.1.1.L'operatore double-splat modifica in modo distruttivo l'hash: si tratta di un bug di Ruby?
Quando le coppie valore-chiave sono utilizzate prima di un **hash
, l'hash rimane non modificato; tuttavia, quando le coppie valore-chiave vengono utilizzate solo dopo lo **hash
, l'hash viene modificato in modo permanente.
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 }
Per confronto, si consideri il comportamento del *
operatore singolo su array:
a = [2]
[1, *a] # => [1, 2]
a # => [2]
[1, *a, 3] # => [1, 2, 3]
a # => [2]
[*a, 3] # => [2, 3]
a # => [2]
L'array rimane invariato per tutta.
facciamo noi supponiamo il comportamento a volte distruttiva di **
è intenzionale, o lo fa sembrare più come un insetto?
In entrambi i casi, dov'è la documentazione che descrive come deve funzionare l'operatore **
?
Ho anche posto questa domanda in the Ruby Forum.
UPDATE
Il bug è stato risolto in Ruby 2.1.3+.
L'utilizzo negli elenchi di parametri si trova nella documentazione di base http://www.ruby-doc.org/core-2.1.1/doc/syntax/methods_rdoc.html. Hash e l'interpolazione letterale dell'array non sembrano apparire da nessuna parte, anche se il singolo sputo ha almeno una specifica: https://github.com/rubyspec/rubyspec/blob/master/language/splat_spec.rb. Non c'è niente di simile per il doppio splat. Semantica rubino sembra essere folcloristico. Sono sicuro che si tratta di un errore nella misura in cui una funzione di linguaggio non documentato può essere bacata! – Gene
non sapevo nemmeno che ti fosse permesso usarlo in una firma di nessun metodo ... – phoet
Sembra che l'hash composto sia lo stesso oggetto del primo elemento in esso se è un hash (hanno lo stesso ID oggetto). Questo è il motivo per cui sono stati modificati. Quando hai due hash 'h' e' i' e fai '{** h, ** i, d: 5}', solo 'h' viene modificato, non' i'. – sawa