Eseguire il codice,Cosa significa questo in linguaggio Ruby?
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
Si otterrà il risultato
1
[2, 3, 4, 5]
Chi mi può aiutare a spiegare l'affermazione head,*tail = a
, Grazie!
Eseguire il codice,Cosa significa questo in linguaggio Ruby?
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
Si otterrà il risultato
1
[2, 3, 4, 5]
Chi mi può aiutare a spiegare l'affermazione head,*tail = a
, Grazie!
head, *tail = a
significa assegnare il primo elemento dell'array a
a head
e assegnare il resto degli elementi a tail
.
*
, a volte chiamato "operatore di splat", fa un certo numero di cose con gli array. Quando si trova sul lato sinistro di un operatore di assegnazione (=
), come nel tuo esempio, significa semplicemente "prendi tutto ciò che è rimasto".
Se omesso il simbolo di quel codice, sarebbe fare questo, invece:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
Ma quando si aggiunge il simbolo di tail
significa "Tutto ciò che non ha ottenuto assegnato alle variabili precedenti (head
), assegnare a tail
. "
io non lo so Rubino a tutti, ma la mia ipotesi è che l'istruzione sta dividendo la lista a
in una testa (primo elemento) e il resto (un'altra lista), assegnando i nuovi valori alle variabili head
e tail
.
Questo meccanismo viene generalmente indicato (almeno in Erlang) come pattern matching.
In primo luogo, è un compito parallelo. In ruby è possibile scrivere
a,b = 1,2
e sarà 1 e B sarà 2. È inoltre possibile utilizzare
a,b = b,a
per scambiare valori (senza la tipica temperatura variabile necessaria in altre lingue).
La stella * è l'operatore pack/unpack. Scrivere
a,b = [1,2,3]
assegnare 1 a ae 2 a b. Utilizzando la stella, i valori 2,3 vengono inseriti in un array e assegnati a b:
a,*b = [1,2,3]
bella risposta! :) ma dovresti davvero cambiare la foto del tuo profilo, sembri un barboncino troppo curato;) hehe – horseyguy
Haha. Non l'ho mai visto prima. Lo prenderò sotto consiglio. :) –
@banister: La sua foto attuale (forse non la stessa usata allora) lo fa sembrare Justin Bieber! –