Verwijzingscellen
Verwijzingscellen zijn opslaglocaties waarmee u veranderlijke waarden kunt maken met verwijzingssemantiek.
Syntaxis
ref expression
Opmerkingen
U gebruikt de ref
functie om een nieuwe verwijzingscel met een initiƫle waarde te maken. Vervolgens kunt u de onderliggende waarde wijzigen omdat deze veranderlijk is. Een verwijzingscel bevat een werkelijke waarde; het is niet alleen een adres.
In het volgende codevoorbeeld ziet u de declaratie en het gebruik van verwijzingscellen.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
De uitvoer is als volgt.
10
11
Verwijzingscellen zijn exemplaren van het Ref
algemene recordtype, dat als volgt wordt gedeclareerd.
type Ref<'a> =
{ mutable contents: 'a }
Het type 'a ref
is een synoniem voor Ref<'a>
. De compiler en IntelliSense in de IDE geven de voormalige voor dit type weer, maar de onderliggende definitie is de laatste.
De ref
operator maakt een nieuwe verwijzingscel. De volgende code is de declaratie van de ref
operator.
let ref x = { contents = x }
In de volgende tabel ziet u de functies die beschikbaar zijn in de verwijzingscel.
Operator, lid of veld | Beschrijving | Type | Definitie |
---|---|---|---|
ref (operator) |
Een waarde inkapselen in een nieuwe verwijzingscel. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (eigenschap) |
Hiermee haalt u de onderliggende waarde op of stelt u deze in. | unit -> 'a |
member x.Value = x.contents |
C#-programmeurs moeten weten dat ref
in C# niet hetzelfde is als ref
in F#. De equivalente constructies in F# zijn byrefs, wat een ander concept is dan verwijzingscellen.
Waarden die als zodanig zijn gemarkeerd mutable
, worden automatisch gepromoveerd naar 'a ref
als ze worden vastgelegd door een sluiting. Zie Waarden.
Afgeschafte constructies
Aangezien F# 6.0 is afgeschaft, worden de volgende operators afgeschaft en geeft het gebruik informatieve waarschuwingen:
Operator, lid of veld | Beschrijving | Type | Definitie |
---|---|---|---|
! (deductieoperator, afgeschaft) |
Retourneert de onderliggende waarde. | 'a ref -> 'a |
let (!) r = r.contents |
:= (toewijzingsoperator, afgeschaft) |
Hiermee wijzigt u de onderliggende waarde. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (recordveld) |
Hiermee haalt u de onderliggende waarde op of stelt u deze in. | 'a |
let ref x = { contents = x } |
In plaats daarvan heeft het directe gebruik .Value
de voorkeur; zie F# RFC FS-1111.
Het veld contents
is beschikbaar voor compatibiliteit met andere versies van ML en zal tijdens de compilatie een waarschuwing opleveren. Als u de waarschuwing wilt uitschakelen, gebruikt u de --mlcompatibility
compileroptie. Zie Compileropties voor meer informatie.