索引屬性
定義對已排序資料進行抽象的類別時,在不公開基礎實作的情況下,提供該資料的索引存取有時可能會很有幫助。 這是使用 Item
成員完成的。
語法
運算式的語法:
// Looking up an indexed property
expr[idx]
/// Assign to an indexed property
expr[idx] <- elementExpr
成員宣告的語法:
// Indexed property that can be read and written to
member self-identifier.Item
with get(index-values) =
get-member-body
and set index-values values-to-set =
set-member-body
// Indexed property can only be read
member self-identifier.Item
with get(index-values) =
get-member-body
// Indexed property that can only be set
member self-identifier.Item
with set index-values values-to-set =
set-member-body
備註
上一個語法的格式示範如何定義同時具有 get
和 set
方法、只有 get
方法,或是只有 set
方法的索引屬性。 您也可以合併針對 get 顯示的語法,以及只針對 set 顯示的語法,產生同時具有 get 和 set 的屬性。 後面這種格式可讓您將不同的可存取性修飾元和屬性放在 get 和 set 方法上。
藉由使用名稱 Item
,編譯器會將屬性視為預設的索引屬性。 您可以在物件執行個體上使用類似陣列的語法來存取預設索引屬性。 例如,如果 o
是定義這個屬性之型別的物件,則會使用 o[index]
語法來存取該屬性。
存取非預設索引屬性的語法是提供屬性的名稱和括弧中的索引,就像一般成員一樣。 例如,如果 o
上的屬性稱為 Ordinal
,您可以寫入 o.Ordinal(index)
以存取它。
無論您使用何種格式,應一律在索引屬性上針對 set 方法使用 curried 格式。 如需 curried 函式的相關資訊,請參閱函式。
在 F# 6 之前,語法 expr.[idx]
用於編製索引。 您可以啟用選擇性的告知性警告(/warnon:3366
或屬性 <WarnOn>3366</WarnOn>
),以報告 expr.[idx]
標記法的使用情況。
範例
下列程式碼範例說明具有 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 方法必須有兩個 curried 引數,第一個是包含索引鍵的元組,第二個是要設定的值。
下列程式碼示範如何搭配多個索引值使用索引屬性。
open System.Collections.Generic
/// Basic implementation of a sparse matrix based on a dictionary
type SparseMatrix() =
let table = new Dictionary<(int * int), float>()
member _.Item
// Because the key is comprised of two values, 'get' has two index values
with get(key1, key2) = table[(key1, key2)]
// 'set' has two index values and a new value to place in the key's position
and set (key1, key2) value = table[(key1, key2)] <- value
let sm = new SparseMatrix()
for i in 1..1000 do
sm[i, i] <- float i * float i