Celdas de referencia
Las celdas de referencia son lugares de almacenamiento que le permiten crear valores mutables con semántica de referencia.
Sintaxis
ref expression
Comentarios
La función ref
se usa para crear una nueva celda de referencia con un valor inicial. A continuación, se puede cambiar el valor subyacente, porque es mutable. Una celda de referencia contiene un valor real; no una mera dirección.
En el ejemplo de código siguiente se muestran 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 Ref
, que se declara como sigue.
type Ref<'a> =
{ mutable contents: 'a }
El tipo 'a ref
es un sinónimo de Ref<'a>
. Tanto el compilador como IntelliSense en el IDE, muestran el primero para este tipo, pero la definición subyacente es el segundo.
El operador ref
crea una nueva celda de referencia. El código siguiente es la declaración del operador ref
.
let ref x = { contents = x }
En la tabla siguiente se muestran las características que están 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 ref
en C# no es lo mismo que ref
en F#. Las construcciones equivalentes en F# son byrefs, que son un concepto diferente de las celdas de referencia.
Los valores marcados como mutable
pueden ser automáticamente promovidos a 'a ref
si los captura una clausura; consulte Valores.
Construcciones en desuso
Desde la 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
; consulte F# RFC FS-1111.
El campo contents
se proporciona por motivos de compatibilidad con otras versiones de ML y generará una advertencia durante la compilación. Para deshabilitar la advertencia, utilice la opción --mlcompatibility
del compilador. Para obtener más información, consulte Opciones del compilador.