Индексированные свойства (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
Заметки
В приведенных выше трех формах синтаксических конструкций показано, как определять индексированные свойства, имеющие и метод 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 ""
Output
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 в таком свойстве должен иметь два каррированных аргумента, первый из которых представляет собой кортеж, содержащий ключи, а второй — задаваемое значение.
В следующем коде демонстрируется использование индексированного свойства с несколькими переменными индекса.
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