Properti Terindeks
Saat menentukan kelas yang mengabstraksikan data yang dipesan, terkadang menyediakan akses terindeks ke data tersebut tanpa mengekspos implementasi yang mendasarinya dapat membantu. Hal ini dilakukan dengan anggota Item
.
Sintaks
Sintaks untuk ekspresi:
// Looking up an indexed property
expr[idx]
/// Assign to an indexed property
expr[idx] <- elementExpr
Sintaks untuk deklarasi anggota:
// 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
Keterangan
Formulir sintaks sebelumnya menunjukkan cara menentukan properti terindeks yang memiliki metode get
dan set
, hanya memiliki metode get
, atau hanya memiliki metode set
. Anda juga dapat menggabungkan sintaks yang ditunjukkan hanya untuk get dan sintaks yang ditunjukkan hanya untuk set, serta menghasilkan properti yang memiliki get dan set. Formulir yang terakhir ini memungkinkan Anda untuk menempatkan pengubah aksesibilitas dan atribut yang berbeda pada metode get dan set.
Dengan menggunakan nama Item
, kompilator memperlakukan properti sebagai properti terindeks default. Properti terindeks default adalah properti yang dapat Anda akses dengan menggunakan sintaks seperti array pada instans objek. Misalnya, jika o
adalah objek dari jenis yang menentukan properti ini, sintaks o[index]
digunakan untuk mengakses properti.
Sintaks untuk mengakses properti terindeks non-default adalah dengan memberikan nama properti dan indeks dalam tanda kurung, seperti halnya anggota biasa. Misalnya, jika properti di o
disebut Ordinal
, Anda menulis o.Ordinal(index)
untuk mengaksesnya.
Terlepas dari formulir mana yang Anda gunakan, Anda harus selalu menggunakan formulir curried untuk metode set pada properti terindeks. Untuk informasi tentang fungsi curried, lihat Functions.
Sebelum F# 6, sintaks expr.[idx]
digunakan untuk pengindeksan. Anda dapat mengaktifkan peringatan informasi opsional (/warnon:3366
atau properti <WarnOn>3366</WarnOn>
) untuk melaporkan penggunaan notasi expr.[idx]
.
Contoh
Contoh kode berikut menggambarkan definisi dan penggunaan properti terindeks default dan non-default yang memiliki metode get dan 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
Properti Terindeks dengan beberapa nilai indeks
Properti terindeks dapat memiliki lebih dari satu nilai indeks. Dalam hal ini, nilai tersebut dipisahkan oleh koma saat properti digunakan. Metode set dalam properti seperti itu harus memiliki dua argumen curried, yang pertama adalah tuple yang berisi kunci, dan yang kedua adalah nilai yang akan ditetapkan.
Kode berikut mendemonstrasikan penggunaan properti terindeks dengan beberapa nilai indeks.
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
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk