2009-09-26 8 views
9

Sto tentando di scrivere del semplice codice in F #, e ottengo questo errore:La variabile mutabile 'i' viene utilizzata in modo non valido.?

Error 1 The mutable variable 'i' is used in an invalid way. Mutable variables may not be captured by closures. Consider eliminating this use of mutation or using a heap-allocated mutable reference cell via 'ref' and '!' 

Codice:

let printProcess = async { 
     let mutable i = 1; 
     while true do 
      System.Console.WriteLine(i);//error is here 
      i <- i + 1; 
    } 

Perché non il Fammi stampare la variabile?

risposta

17

Non è possibile fare riferimento a mutabili all'interno di una chiusura e questo include costrutti come i blocchi seq {} e async {}.

Si potrebbe scrivere

let printProcess = async { 
     let i = ref 1 
     while true do 
      System.Console.WriteLine(!i) 
      i := !i + 1 
    } 

Vedi this blog per qualche discussione.

+6

La risposta breve per il motivo per cui è necessario farlo è che i valori "mutabili" sono nello stack e che i valori "ref" sono nell'heap. Poiché la cornice dello stack verrà cancellata non appena la funzione esce, tutti i valori mutabili vengono recuperati. I valori di riferimento d'altra parte si manterranno come qualsiasi altro oggetto garbage collocato. –

+3

Un altro modo per dirla è che F # acquisisce valori, non variabili. Per questo motivo, catturare il valore di una variabile mutabile equivarrebbe a catturare il valore di una variabile immutabile, poiché il valore stesso è sempre immutabile. Questo comportamento probabilmente non è quello che la gente si aspetterebbe, ed è stato quindi proibito. – Joh

Problemi correlati