2015-07-16 13 views
6
(irb) a, b = 5 
a => 5 
b => nil 

Non dovrebbe essere il contrario? Cosa sta realmente accadendo qui?Perché l'espressione "a, b = 5" imposta a a 5, ma b a zero in Ruby?

+1

L'assegnazione multipla considera il lato destro dell'espressione come un array splattato. 'a, b = 5' è interpretato come' a, b = * [5] ' –

+1

Se si desidera assegnare il valore a entrambe le variabili, utilizzare' a = b = 5'. – Gumbo

risposta

6

Mentre stavo scrivendo questo il mio collega ha scoperto il motivo:

Rubino tratta a, b = 5 come a, b = 5, nil

In python3, un TypeError viene generata.

+1

Se sei abituato a JavaScript, dove 'var a, b = 5' sono due compiti separati, questo sarà una sorpresa. In Ruby, l'assegnazione delle liste è più simile a '(a, b) = (5, nil)' quando espansa. Il * lato sinistro * è considerato come un elenco. Le cose si fanno ancora più confuse con 'a, b = 5, c = 3' che risulta in' a = 5, b = 3, c = 3'. – tadman

+0

'a, b = 5, c = 3' è meno confuso se lo leggi come ->' a, b = * [5, c = 3] ' –

+1

Rubati tutti i miei punti :( – Jared

2

Per assegnare un valore a b utilizzando più assegnazioni, è necessario assegnargli un secondo valore.

a, b = 5, 6 

a = 5 
b = 6 

quando non si fornisce un secondo valore, Ruby dà b un valore di nil

1

Questa è una caratteristica importante di Ruby chiama assegnazione multipla.

L'assegnazione multipla esegue più assegnazioni da espressioni o da un array. È un modo rapido per assegnare più variabili contemporaneamente.

Se si dichiarano tre variabili, ma si assegnano solo valori a due di esse, la terza riceverà nil per impostazione predefinita.

La parte di Assegnazione multipla di this documentation spiega la funzione e diversi esempi.

Problemi correlati