Células de referência

As células de referência são locais de armazenamento que permitem a criação de valores mutáveis com semântica de referência.

Sintaxe

ref expression

Comentários

Você usa a função ref para criar uma célula de referência com um valor inicial. Em seguida, é possível alterar o valor subjacente porque ele é mutável. Uma célula de referência mantém um valor real. Não é apenas um endereço.

O exemplo de código a seguir ilustra a declaração e o uso das células de referência.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

A saída é a seguinte.

10
11

As células de referência são instâncias do tipo de registro genérico Ref, declarado da maneira a seguir.

type Ref<'a> =
    { mutable contents: 'a }

O tipo 'a ref é um sinônimo de Ref<'a>. O compilador e o IntelliSense no IDE exibem o primeiro para esse tipo, mas a definição subjacente é do último.

O operador ref cria uma nova célula de referência. O código a seguir é a declaração do operador ref.

let ref x = { contents = x }

A tabela a seguir mostra os recursos disponíveis na célula de referência.

Operador, membro ou campo Descrição Type Definição
ref (operador) Encapsula um valor em uma nova célula de referência. 'a -> 'a ref let ref x = { contents = x }
Value (propriedade) Obtém ou define o valor subjacente. unit -> 'a member x.Value = x.contents

Os programadores de C# devem saber que ref em C# não é a mesma coisa que ref em F#. As construções equivalentes em F# são byrefs, que são um conceito diferente das células de referência.

Os valores marcados como mutable poderão ser promovidos automaticamente para 'a ref se forem capturados por um fechamento. Confira Valores.

Constructos preteridos

Desde o F# 6.0, os seguintes operadores são preteridos e seu uso fornece avisos informativos:

Operador, membro ou campo Descrição Type Definição
! (operador de desreferência, preterido) Retorna o valor subjacente. 'a ref -> 'a let (!) r = r.contents
:= (operador de atribuição, preterido) Altera o valor subjacente. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (campo de registro) Obtém ou define o valor subjacente. 'a let ref x = { contents = x }

Em vez disso, é preferível o uso direto de .Value. Confira F# RFC FS-1111.

O campo contents é fornecido para compatibilidade com outras versões do ML e produzirá um aviso durante a compilação. Para desabilitar o aviso, use a opção do compilador --mlcompatibility. Para obter mais informações, consulte Opções do compilador.

Confira também