Ссылочные ячейки
Ссылочные ячейки — это расположения хранилища, позволяющие создавать изменяемые значения с семантикой ссылок.
Синтаксис
ref expression
Замечания
Функция используется ref
для создания новой эталонной ячейки с начальным значением. Базовое значение затем можно изменить, так как оно является изменяемым. Ссылочная ячейка содержит фактическое значение; это не просто адрес.
Следующий пример кода иллюстрирует объявление и использование ссылочных ячеек.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
Выходные данные выглядят следующим образом.
10
11
Ссылочные ячейки являются экземплярами универсального типа записей Ref
, который объявляется следующим образом.
type Ref<'a> =
{ mutable contents: 'a }
Тип 'a ref
является синонимом Ref<'a>
. В интегрированной среде разработки в компиляторе и в IntelliSense отображается первое обозначение данного типа, однако базовым определением является второе.
Оператор ref
создает новую ссылочную ячейку. Следующий код представляет собой объявление оператора ref
.
let ref x = { contents = x }
В следующей таблице перечислены возможности, доступные для ссылочной ячейки.
Оператор, член или поле | Описание | Тип | Определение |
---|---|---|---|
ref (оператор) |
Инкапсулирует значение в новую ссылочную ячейку. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (свойство) |
Получает или задает базовое значение. | unit -> 'a |
member x.Value = x.contents |
Программисты C# должны знать, что в C# не то же самое, что ref
ref
и в F#. Эквивалентные конструкции в F# являются байтами, которые являются разными понятиями от ссылочных ячеек.
Значения, помеченные как mutable
могут быть автоматически повышены до 'a ref
значения при захвате при закрытии; см. раздел "Значения".
Устаревшие конструкции
Так как F# 6.0, следующие операторы не рекомендуется использовать, а их использование дает информационные предупреждения:
Оператор, член или поле | Описание | Тип | Определение |
---|---|---|---|
! (оператор dereference, устаревший) |
Возвращает базовое значение. | 'a ref -> 'a |
let (!) r = r.contents |
:= (оператор назначения, нерекомендуемый) |
Изменяет базовое значение. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (поле записи) |
Получает или задает базовое значение. | 'a |
let ref x = { contents = x } |
Вместо этого прямое использование .Value
предпочтительнее; см. статью F# RFC FS-1111.
Поле contents
предусмотрено для совместимости с другими версиями языка ML, и его наличие приводит к выводу предупреждения в процессе компиляции. Для отключения этого предупреждения используется параметр компилятора --mlcompatibility
. Дополнительные сведения см. в разделе Параметры компилятора.