Ссылочные ячейки

Ссылочные ячейки — это расположения хранилища, позволяющие создавать изменяемые значения с семантикой ссылок.

Синтаксис

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# не то же самое, что refref и в 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. Дополнительные сведения см. в разделе Параметры компилятора.

См. также