Sto imparando le basi di Ruby (appena iniziato) e mi sono imbattuto nello Hash.[]
method. E 'stato introdotto conEsistono "regole" per lo zucchero sintattico di Ruby?
a = ["foo", 1, "bar", 2]
=> ["foo", 1, "bar", 2]
Hash[*a]
=> {"foo"=>1, "bar"=>2}
Con un piccolo pensiero, ho capito che Hash[*a]
è equivalente a Hash.[](*a)
o Hash.[] *a
. La mia domanda è: perché è così. Cos'è che ti consente di inserire lo *a
tra parentesi quadre, e c'è una sorta di regola per dove e quando può essere utilizzato "it"?
Modifica: La mia formulazione sembra causare una certa confusione. Non sto chiedendo l'espansione dell'array. Ho capito. La mia domanda è fondamentalmente la seguente: se []
è un nome di metodo, perché è corretto inserire gli argomenti tra parentesi? Sembra quasi - ma non del tutto - come dire che se hai un metodo Foo.dood
e vuoi passare la stringa "hey"
ad esso, allora potresti scrivere Foo.do"hey"od
.
Vedo molte risposte incentrate su '* a' in un'invocazione di metodo. Tuttavia, sarebbe bello vedere altre produzioni affrontate, ad esempio perché '[1, * a]' funziona "come previsto" (che produce un risultato diverso da '[1, a]') e perché '[* a, 1] 'non è valido. Sarebbe anche bello vedere come "splat" si riferisce al compito e come può/fa interagire con l'assegnazione-decomposizione di Ruby ... forse probabilmente una domanda SO diversa interamente ;-) Sarebbe * davvero bello * se ci fosse un specifica semi-formale rubino. Collegamenti a quasi-specifiche renderebbero le risposte migliori. –
@pst: buone domande. Se fai una nuova domanda su SO, pubblica qui il link in modo che io possa seguirlo. –
nota che il modo usuale è di inviare una serie di coppie: Hash [[[key1, value1], [key2, value2]]] – tokland