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.