参照セル
参照セルは、参照セマンティクスを持つ変更可能な値を作成できる格納場所です。
構文
ref expression
解説
値をカプセル化する新しい参照セルを作成するには、値の前に ref
演算子を指定します。 基になる値は変更可能なので、後で変更できます。
参照セルは、単なるアドレスではなく、実際の値を保持します。 ref
演算子を使用して参照セルを作成すると、基の値のコピーが、カプセル化された変更可能な値として作成されます。
参照セルを逆参照するには、!
(感嘆符) 演算子を使用します。
次のコード例は、参照セルの宣言と使用方法を示しています。
// Declare a reference.
let refVar = ref 6
// Change the value referred to by the reference.
refVar := 50
// Dereference by using the ! operator.
printfn "%d" !refVar
出力は 50
になります。
参照セルは、次のように宣言される Ref
ジェネリック レコード型のインスタンスです。
type Ref<'a> =
{ mutable contents: 'a }
'a ref
型は、Ref<'a>
のシノニムです。 コンパイラと IDE の IntelliSense では、この型について前者が表示されますが、基になる定義は後者です。
ref
演算子は、新しい参照セルを作成します。 次のコードは、ref
演算子の宣言です。
let ref x = { contents = x }
次の表に、参照セルで使用できる機能を示します。
演算子、メンバー、またはフィールド | 説明 | Type | 定義 |
---|---|---|---|
! (逆参照演算子) |
基になる値を返します。 | 'a ref -> 'a |
let (!) r = r.contents |
:= (代入演算子) |
基になる値を変更します。 | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
ref (演算子) |
新しい参照セルに値をカプセル化します。 | 'a -> 'a ref |
let ref x = { contents = x } |
Value (プロパティ) |
基になる値を取得または設定します。 | unit -> 'a |
member x.Value = x.contents |
contents (レコード フィールド) |
基になる値を取得または設定します。 | 'a |
let ref x = { contents = x } |
基になる値にアクセスする方法はいくつかあります。 逆参照演算子 (!
) によって返される値は、代入可能な値ではありません。 したがって、基になる値を変更する場合は、代わりに代入演算子 (:=
) を使用する必要があります。
Value
プロパティと contents
フィールドは、いずれも代入可能な値です。 したがって、次のコードに示すように、これらを使用して基になる値にアクセスしたり、基になる値を変更したりできます。
let xRef : int ref = ref 10
printfn "%d" (xRef.Value)
printfn "%d" (xRef.contents)
xRef.Value <- 11
printfn "%d" (xRef.Value)
xRef.contents <- 12
printfn "%d" (xRef.contents)
出力は次のとおりです。
10
10
11
12
contents
フィールドは、他のバージョンの ML との互換性のために用意されており、コンパイル中に警告を生成します。 この警告を無効にするには、--mlcompatibility
コンパイラ オプションを使用します。 詳細については、「コンパイラ オプション」を参照してください。
C# プログラマは、C# の ref
が F# の ref
と同じものではないことを理解している必要があります。 F# の同等のコンストラクトは、参照セルとは異なる概念の byref です。
mutable
としてマークされた値は、クロージャによってキャプチャされた場合に自動的に 'a ref
に昇格される場合があります。「値」を参照してください。