Referenciacellák
A referenciacellák olyan tárolóhelyek, amelyek lehetővé teszik a referencia szemantikával rendelkező, mutable értékek létrehozását.
Syntax
ref expression
Megjegyzések
A függvény használatával ref
létrehoz egy új referenciacellát egy kezdeti értékkel. Ezután módosíthatja a mögöttes értéket, mert az nem módosítható. A referenciacellák tényleges értéket tárolnak; ez nem csak egy cím.
Az alábbi példakód a referenciacellák deklarálását és használatát szemlélteti.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
A kimenet a következő.
10
11
A referenciacellák az Ref
általános rekordtípus példányai, amelyeket a következőképpen deklarálunk.
type Ref<'a> =
{ mutable contents: 'a }
A típus 'a ref
a szinonimája.Ref<'a>
A fordító és az IntelliSense az IDE-ben az előbbit jeleníti meg ehhez a típushoz, de a mögöttes definíció az utóbbi.
Az ref
operátor létrehoz egy új referenciacellát. Az alábbi kód az operátor deklarációja ref
.
let ref x = { contents = x }
Az alábbi táblázat a referenciacellában elérhető funkciókat mutatja be.
Operátor, tag vagy mező | Leírás | Típus | Definíció |
---|---|---|---|
ref (operátor) |
Egy érték beágyazása egy új referenciacellába. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (tulajdonság) |
Lekéri vagy beállítja a mögöttes értéket. | unit -> 'a |
member x.Value = x.contents |
A C#-programozóknak tudniuk kell, hogy ref
a C#-ban nem ugyanaz, mint ref
az F#-ban. Az F# megfelelő szerkezetei byrefsek, amelyek eltérnek a referenciacelláktól.
A lezárás által rögzített mutable
értékek automatikusan előléptethetők 'a ref
, lásd: Értékek.
Elavult szerkezetek
Az F# 6.0 óta a következő operátorok elavultak, és használatuk tájékoztató figyelmeztetéseket ad:
Operátor, tag vagy mező | Leírás | Típus | Definíció |
---|---|---|---|
! (elévülési operátor, elavult) |
A mögöttes értéket adja vissza. | 'a ref -> 'a |
let (!) r = r.contents |
:= (hozzárendelés-operátor, elavult) |
Módosítja a mögöttes értéket. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (rekordmező) |
Lekéri vagy beállítja a mögöttes értéket. | 'a |
let ref x = { contents = x } |
Ehelyett előnyben részesítik a közvetlen használatot .Value
; lásd: F# RFC FS-1111.
A mező contents
az ML más verzióival való kompatibilitás érdekében van megadva, és a fordítás során figyelmeztetést fog eredményezni. A figyelmeztetés letiltásához használja a --mlcompatibility
fordítót. További információt a Fordító beállításai című témakörben talál.