Referensceller
Referensceller är lagringsplatser som gör att du kan skapa föränderliga värden med referenssemantik.
Syntax
ref expression
Kommentarer
Du använder ref
funktionen för att skapa en ny referenscell med ett initialt värde. Du kan sedan ändra det underliggande värdet eftersom det är föränderligt. En referenscell innehåller ett faktiskt värde. det är inte bara en adress.
Följande kodexempel illustrerar deklarationen och användningen av referensceller.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
Utdata är följande.
10
11
Referensceller är instanser av den Ref
generiska posttypen, som deklareras enligt följande.
type Ref<'a> =
{ mutable contents: 'a }
Typen 'a ref
är en synonym för Ref<'a>
. Kompilatorn och IntelliSense i IDE visar det förra för den här typen, men den underliggande definitionen är den senare.
Operatorn ref
skapar en ny referenscell. Följande kod är operatorns ref
deklaration.
let ref x = { contents = x }
I följande tabell visas de funktioner som är tillgängliga i referenscellen.
Operator, medlem eller fält | beskrivning | Typ | Definition |
---|---|---|---|
ref (operator) |
Kapslar in ett värde i en ny referenscell. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (egenskap) |
Hämtar eller anger det underliggande värdet. | unit -> 'a |
member x.Value = x.contents |
C#-programmerare bör veta att ref
I C# inte är samma sak som ref
i F#. Motsvarande konstruktioner i F# är byrefs, som är ett annat begrepp än referensceller.
Värden som markerats som mutable
kan höjas upp automatiskt till 'a ref
om de fångas upp av en stängning. Se Värden.
Inaktuella konstruktioner
Eftersom F# 6.0 är följande operatorer inaktuella och deras användning ger informationsvarningar:
Operator, medlem eller fält | beskrivning | Typ | Definition |
---|---|---|---|
! (avreferenceoperator, inaktuell) |
Returnerar det underliggande värdet. | 'a ref -> 'a |
let (!) r = r.contents |
:= (tilldelningsoperator, inaktuell) |
Ändrar det underliggande värdet. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (postfält) |
Hämtar eller anger det underliggande värdet. | 'a |
let ref x = { contents = x } |
I stället föredras direkt användning av .Value
. Se F# RFC FS-1111.
Fältet contents
tillhandahålls för kompatibilitet med andra versioner av ML och skapar en varning under kompilering. Om du vill inaktivera varningen använder du kompilatoralternativet --mlcompatibility
. Mer information finns i Kompilatoralternativ.