2009-09-26 11 views
9

Ja próbuje napisać jakiś prosty kod w F #, a ja dostać ten błąd:Zmienna zmienna "i" jest używana w nieprawidłowy sposób.?

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 '!' 

Kod:

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

Dlaczego nie będzie to niech mi drukować zmienną?

Odpowiedz

17

Nie można odwoływać się do mutables w zamknięciu i obejmuje takie konstrukcje, jak seq {} i async {}.

można napisać

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

Zobacz this blog jakiegoś dyskusji.

+6

Krótka odpowiedź, dlaczego musisz to zrobić, to że wartości "zmienne" znajdują się na stosie, a wartości "ref" znajdują się na stercie. Ponieważ ramka stosu zostanie wyczyszczona, gdy tylko funkcja wyjdzie, wszystkie zmienne wartości zostaną odzyskane. Wartości ref z drugiej strony będą zachowywać się tak, jak każdy inny obiekt zebrany na śmieci. –

+3

Innym sposobem na stwierdzenie, że F # przechwytuje wartości, a nie zmienne. Z tego powodu przechwytywanie wartości zmiennej zmiennej byłoby takie samo jak uchwycenie wartości niezmiennych zmiennych, ponieważ sama wartość jest zawsze niezmienna. Takie zachowanie prawdopodobnie nie jest zgodne z oczekiwaniami ludzi i dlatego było zabronione. – Joh