参照セル

参照セルは、参照セマンティクスを持つ変更可能な値を作成できる格納場所です。

構文

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> のシノニムです。 コンパイラと IDE の IntelliSense では、この型について前者が表示されますが、基になる定義は後者です。

ref 演算子は、新しい参照セルを作成します。 次のコードは、ref 演算子の宣言です。

let ref x = { contents = x }

次の表に、参照セルで使用できる機能を示します。

演算子、メンバー、またはフィールド 説明 Type 定義
ref (演算子) 新しい参照セルに値をカプセル化します。 'a -> 'a ref let ref x = { contents = x }
Value (プロパティ) 基になる値を取得または設定します。 unit -> 'a member x.Value = x.contents

C# プログラマは、C# の ref が F# の ref と同じものではないことを理解している必要があります。 F# の同等のコンストラクトは、参照セルとは異なる概念の byref です。

mutable としてマークされた値は、クロージャによってキャプチャされた場合に自動的に 'a ref に昇格される場合があります。「」を参照してください。

非推奨のコンストラクト

F# 6.0 以降、次の演算子は非推奨となり、使用すると情報の警告が表示されます。

演算子、メンバー、またはフィールド 説明 Type 定義
! (逆参照演算子、非推奨) 基になる値を返します。 '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 コンパイラ オプションを使用します。 詳細については、「コンパイラ オプション」を参照してください。

関連項目