Compartir vía


Celdas de referencia

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.

Consulte también