2015-11-20 16 views
5

Perché non riesco a compilare un elenco con questo semplice ciclo?Riempi un elenco con un ciclo for

new_data = [] 
for data <- old_data do 
    new_data = List.insert_at(new_data, -1, data) 
end 

Dopo questa operazione la mia lista new_data è ancora vuota, anche se il ciclo viene eseguito N volte.

+1

È opportuno ricordare che nella programmazione funzionale in generale, tutto è un'espressione. Come illustrato da @Gazler di seguito, è possibile assegnare direttamente il risultato della comprensione a un valore in modo da non dover eseguire il modello "Inizializza il valore su un valore vuoto e quindi assegnarlo". –

+0

A proposito, questa non è una domanda di Erlang. Sto rimuovendo il tag erlang da questo. –

risposta

16

In Elixir, non è possibile modificare il valore a cui fa riferimento la variabile come spiegato in Are Elixir variables really immutable?. Perché in questo caso non è un "loop" è un list comprehension.

è possibile assegnare al risultato di una comprensione con:

new_data = for data <- old_data do 
    data 
end 

In linea:

new_data = List.insert_at(new_data, -1, data) 

La variabile new_data è locale per la portata della comprensione. È possibile utilizzare il valore new_data precedente, ma non sarà possibile eseguire nuovamente il rebind per l'ambito esterno. Per questo motivo new_data è ancora [] dopo la tua comprensione. Le regole di scoping sono spiegate in http://elixir-lang.readthedocs.org/en/latest/technical/scoping.html

+0

Questo è interessante. Grazie. Sapevo che le variabili sono inconfutabili. Ma ho pensato di dichiarare la lista prima di poterlo riassemblare. – 0xAffe

+0

Grazie! Questo mi ha portato troppo tempo per capire. – SMASH