インデックス付きプロパティ (F#)
インデックス付きプロパティは、順序が指定されたデータへの配列様式のアクセスを提供するプロパティです。
// Indexed property that has both get and set defined.
member self-identifier.PropertyName
with get(index-variable) =
get-function-body
and set index-variables value-variables =
set-function-body
// Indexed property that has get only.
member self-identifier.PropertyName(index-variable) =
get-function-body
// Alternative syntax for indexed property with get only
member self-identifier.PropertyName
with get(index-variables) =
get-function-body
// Indexed property that has set only.
member self-identifier.PropertyName
with set index-variables value-variables =
set-function-body
解説
前の構文の 3 つの形式は、get メソッドと set メソッドの両方を持つインデックス付きプロパティ、get メソッドのみを持つインデックス付きプロパティ、および set メソッドのみを持つインデックス付きプロパティを定義する方法を示しています。 また、get のみの構文と set のみの構文を組み合わせて、get と set の両方を持つプロパティを作成することもできます。 この後者の形式を使用すると、get メソッドと set メソッドに、異なるアクセシビリティ修飾子および属性を指定できます。
PropertyName が Item である場合、コンパイラはプロパティを既定のインデックス付きプロパティとして扱います。 既定のインデックス付きプロパティは、オブジェクト インスタンスで配列様式の構文を使用してアクセスできるプロパティです。 たとえば、obj がこのプロパティを定義する型のオブジェクトである場合は、obj.[index] という構文を使用してプロパティにアクセスします。
既定以外のインデックス付きプロパティにアクセスするための構文では、プロパティの名前と、かっこで囲んだインデックスを指定します。 たとえば、プロパティが Ordinal である場合は、obj.Ordinal(index) と記述してプロパティにアクセスします。
使用する形式に関係なく、インデックス付きプロパティの set メソッドに対しては、常にカリー化形式を使用する必要があります。 カリー化関数については、「関数 (F#)」を参照してください。
使用例
次のコード例は、get メソッドと set メソッドを持つ既定のインデックス付きプロパティと既定以外のインデックス付きプロパティの定義と使用を示します。
type NumberStrings() =
let mutable ordinals = [| "one"; "two"; "three"; "four"; "five";
"six"; "seven"; "eight"; "nine"; "ten" |]
let mutable cardinals = [| "first"; "second"; "third"; "fourth";
"fifth"; "sixth"; "seventh"; "eighth";
"ninth"; "tenth" |]
member this.Item
with get(index) = ordinals.[index]
and set index value = ordinals.[index] <- value
member this.Ordinal
with get(index) = ordinals.[index]
and set index value = ordinals.[index] <- value
member this.Cardinal
with get(index) = cardinals.[index]
and set index value = cardinals.[index] <- value
let nstrs = new NumberStrings()
nstrs.[0] <- "ONE"
for i in 0 .. 9 do
printf "%s " (nstrs.[i])
printfn ""
nstrs.Cardinal(5) <- "6th"
for i in 0 .. 9 do
printf "%s " (nstrs.Ordinal(i))
printf "%s " (nstrs.Cardinal(i))
printfn ""
出力
ONE two three four five six seven eight nine ten
ONE first two second three third four fourth five fifth six 6th
seven seventh eight eighth nine ninth ten tenth
複数のインデックス変数を持つインデックス付きプロパティ
インデックス付きプロパティには、複数のインデックス変数を含めることができます。 この場合は、インデックス付きプロパティを使用するときに、変数をコンマで区切ります。 このようなプロパティの set メソッドには、2 つのカリー化引数を使用する必要があります。最初の引数は、キーを含むタプルです。2 番目の引数は、設定する値です。
次のコードは、複数のインデックス変数を含むインデックス付きプロパティの使用方法を示しています。
open System.Collections.Generic
type SparseMatrix() =
let mutable table = new Dictionary<(int * int), float>()
member this.Item
with get(key1, key2) = table.[(key1, key2)]
and set (key1, key2) value = table.[(key1, key2)] <- value
let matrix1 = new SparseMatrix()
for i in 1..1000 do
matrix1.[i, i] <- float i * float i