2010-09-01 18 views

risposta

16

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. "

+0

bella risposta! :) ma dovresti davvero cambiare la foto del tuo profilo, sembri un barboncino troppo curato;) hehe – horseyguy

+0

Haha. Non l'ho mai visto prima. Lo prenderò sotto consiglio. :) –

+0

@banister: La sua foto attuale (forse non la stessa usata allora) lo fa sembrare Justin Bieber! –

0

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.

8

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]