2012-12-12 11 views
6

Sto avendo difficoltà a comprendere ciò che rende il seguente comportamento possibile (tratto dal libro rubino piccone):Lambda Comportamento

def power_proc_generator 
    value = 1 
    lambda {value += value} 
end 

power_proc = power_proc_generator 

3.times {puts power_proc.call} # => 2,4,8 
3.times {puts power_proc_generator.call()} # => 2,2,2 

Io non vedo come l'oggetto "power_proc" consente il valore di continuare a raddoppiare come Suppongo (erroneamente sembra) che ogni chiamata riassegna il valore a 1.

La mia domanda è perché "3.times {puts power_proc.call}" restituisce "2,4,8" e non "2, 2,2 "?

+0

Prova a indicare la tua domanda come una domanda, quindi c'è meno confusione. – knownasilya

+0

Mi dispiace, ho chiarito con una domanda vera e propria. – Discorick

risposta

5

power_proc_generator restituisce un lambda che utilizza (e modifica) il valore di una variabile nell'ambito circostante. Questo è noto come chiusura: la funzione restituita "si chiude" sul valore della variabile value. Quindi ogni volta che chiami la funzione restituita, moltiplica lo value di due. La parte importante è che value rimane tra le chiamate a power_proc.call, quindi stai modificando la variabile esistente.

Inoltre, per approfondire la differenza tra la stampa e power_proc_generatorpower_proc.call-power_proc_generator restituisce una nuova funzione ogni volta che viene chiamato, è per questo che non vedi mai value rivalutazione. power_proc.call, d'altra parte, continua a chiamare la stessa funzione più volte.

+0

Ok, quindi penso che il mio problema fosse meno la comprensione di lambdas e altro ancora sulla non comprensione delle chiusure, in modo che le chiusure portino lo stato variabile più recente, la chiamata di funzione non-oggetto dovrebbe semplicemente rivalutare da zero. – Discorick

2

power_proc_generator restituisce una lambda che include una chiusura che contiene la variabile 'valore'. In modo tale variabile si blocca in giro da un power_proc.call al successivo.