Поделиться через


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

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

Синтаксис

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 предоставляется для совместимости с другими версиями машинного обучения и выдает предупреждение во время компиляции. Чтобы отключить предупреждение, используйте параметр компилятора --mlcompatibility . Дополнительные сведения см. в параметрах компилятора .

См. также