インデックス付きプロパティ (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

参照

その他の技術情報

メンバー (F#)