参照セルReference Cells

参照セルは、参照セマンティクスを使用して変更可能な値を作成できるストレージの場所です。Reference cells are storage locations that enable you to create mutable values with reference semantics.

構文Syntax

ref expression

コメントRemarks

値をカプセル化する新しい参照セルを作成するには、値の前に ref 演算子を指定します。You use the ref operator before a value to create a new reference cell that encapsulates the value. 基になる値は変更可能なので、後で変更できます。You can then change the underlying value because it is mutable.

参照セルは、単なるアドレスではなく、実際の値を保持します。A reference cell holds an actual value; it is not just an address. ref 演算子を使用して参照セルを作成すると、基の値のコピーが、カプセル化された変更可能な値として作成されます。When you create a reference cell by using the ref operator, you create a copy of the underlying value as an encapsulated mutable value.

参照セルを逆参照するには、! (感嘆符) 演算子を使用します。You can dereference a reference cell by using the ! (bang) operator.

次のコード例は、参照セルの宣言と使用方法を示しています。The following code example illustrates the declaration and use of reference cells.

// 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になります。The output is 50.

参照セルは、次のように宣言される Ref ジェネリック レコード型のインスタンスです。Reference cells are instances of the Ref generic record type, which is declared as follows.

type Ref<'a> =
{ mutable contents: 'a }

'a ref 型は、Ref<'a> のシノニムです。The type 'a ref is a synonym for Ref<'a>. コンパイラと IDE の IntelliSense では、この型について前者が表示されますが、基になる定義は後者です。The compiler and IntelliSense in the IDE display the former for this type, but the underlying definition is the latter.

ref 演算子は、新しい参照セルを作成します。The ref operator creates a new reference cell. 次のコードは、ref 演算子の宣言です。The following code is the declaration of the ref operator.

let ref x = { contents = x }

次の表に、参照セルで使用できる機能を示します。The following table shows the features that are available on the reference cell.

演算子、メンバー、またはフィールドOperator, member, or field 説明Description Type 定義Definition
! (逆参照演算子)! (dereference operator) 基になる値を返します。Returns the underlying value. 'a ref -> 'a let (!) r = r.contents
:= (代入演算子):= (assignment operator) 基になる値を変更します。Changes the underlying value. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
ref (演算子)ref (operator) 新しい参照セルに値をカプセル化します。Encapsulates a value into a new reference cell. 'a -> 'a ref let ref x = { contents = x }
Value (プロパティ)Value (property) 基になる値を取得または設定します。Gets or sets the underlying value. unit -> 'a member x.Value = x.contents
contents (レコード フィールド)contents (record field) 基になる値を取得または設定します。Gets or sets the underlying value. 'a let ref x = { contents = x }

基になる値にアクセスする方法はいくつかあります。There are several ways to access the underlying value. 逆参照演算子 (!) によって返される値は、代入可能な値ではありません。The value returned by the dereference operator (!) is not an assignable value. したがって、基になる値を変更する場合は、代わりに代入演算子 (:=) を使用する必要があります。Therefore, if you are modifying the underlying value, you must use the assignment operator (:=) instead.

Value プロパティと contents フィールドは、いずれも代入可能な値です。Both the Value property and the contents field are assignable values. したがって、次のコードに示すように、これらを使用して基になる値にアクセスしたり、基になる値を変更したりできます。Therefore, you can use these to either access or change the underlying value, as shown in the following code.

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)

出力は次のとおりです。The output is as follows.

10
10
11
12

contents フィールドは、他のバージョンの ML との互換性のために用意されており、コンパイル中に警告を生成します。The field contents is provided for compatibility with other versions of ML and will produce a warning during compilation. この警告を無効にするには、--mlcompatibility コンパイラ オプションを使用します。To disable the warning, use the --mlcompatibility compiler option. 詳細については、「コンパイラ オプション」を参照してください。For more information, see Compiler Options.

C#のC#は、の場合と同じではないことrefをF#プログラマが理解しているref必要があります。C# programmers should know that ref in C# is not the same thing as ref in F#. の同等の構成F#体は、参照セルとは異なる概念であるbyrefです。The equivalent constructs in F# are byrefs, which are a different concept from reference cells.

としてmutableマークされた'a refは、クロージャによってキャプチャされた場合に自動的にに昇格される場合があります。Values marked as mutablemay be automatically promoted to 'a ref if captured by a closure; see Values.

関連項目See also