Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las celdas de referencia son ubicaciones de almacenamiento que permiten crear valores mutables con semántica de referencia.
Sintaxis
ref expression
Observaciones
La función se usa ref para crear una nueva celda de referencia con un valor inicial. A continuación, puede cambiar el valor subyacente porque es mutable. Una celda de referencia contiene un valor real; no es solo una dirección.
En el ejemplo de código siguiente se muestra la declaración y el uso de celdas de referencia.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
La salida es la siguiente.
10
11
Las celdas de referencia son instancias del tipo de registro genérico, que se declara de la Ref manera siguiente.
type Ref<'a> =
{ mutable contents: 'a }
El tipo 'a ref es un sinónimo de Ref<'a>. El compilador e IntelliSense del IDE muestran el anterior para este tipo, pero la definición subyacente es la última.
El ref operador crea una nueva celda de referencia. El código siguiente es la declaración del ref operador .
let ref x = { contents = x }
En la tabla siguiente se muestran las características disponibles en la celda de referencia.
| Operador, miembro o campo | Descripción | Tipo | Definición |
|---|---|---|---|
ref (operador) |
Encapsula un valor en una nueva celda de referencia. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (propiedad) |
Obtiene o establece el valor subyacente. | unit -> 'a |
member x.Value = x.contents |
Los programadores de C# deben saber que en C# no es lo mismo ref que ref en F#. Las construcciones equivalentes de F# son byrefs, que son un concepto diferente de las celdas de referencia.
Los valores marcados como mutable se pueden promover automáticamente a 'a ref si se capturan mediante un cierre; vea Valores.
Construcciones en desuso
Dado que F# 6.0, los operadores siguientes están en desuso y su uso proporciona advertencias informativas:
| Operador, miembro o campo | Descripción | Tipo | Definición |
|---|---|---|---|
! (operador de desreferencia, en desuso) |
Devuelve el valor subyacente. | 'a ref -> 'a |
let (!) r = r.contents |
:= (operador de asignación, en desuso) |
Cambia el valor subyacente. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (campo de registro) |
Obtiene o establece el valor subyacente. | 'a |
let ref x = { contents = x } |
En su lugar, se prefiere el uso directo de .Value ; vea F# RFC FS-1111.
El campo contents se proporciona por compatibilidad con otras versiones de ML y generará una advertencia durante la compilación. Para deshabilitar la advertencia, use la --mlcompatibility opción del compilador. Para obtener más información, vea Opciones del compilador.