Propiedades indizadas (F#)
Las propiedades indizadas son propiedades que proporcionan acceso a datos ordenados como si fueran matrices.
// 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
Comentarios
Las tres formas de la sintaxis anterior muestran cómo definir propiedades indizadas que tienen un método set y get, únicamente un método get, o bien únicamente un método set.También se pueden combinar la sintaxis mostrada para get únicamente y la mostrada para set únicamente, y generar una propiedad que tenga tanto get como set.Esta última forma permite colocar distintos modificadores y atributos de accesibilidad a los métodos get y set.
Cuando PropertyName es Item, el compilador trata la propiedad como una propiedad indizada predeterminada.Una propiedad indizada predeterminada es una propiedad a la que se puede tener acceso mediante una sintaxis de matriz para la instancia de objeto.Por ejemplo, si obj es un objeto del tipo que define esta propiedad, se utiliza la sintaxis obj.[index] para tener acceso a la propiedad.
La sintaxis para tener acceso a una propiedad indizada no predeterminada consiste en proporcionar el nombre de la propiedad y el índice entre paréntesis.Por ejemplo, si la propiedad es Ordinal, se escribe obj.Ordinal(index) para tener acceso a ella.
Con independencia de la forma utilizada, siempre se debe usar la forma currificada para el método set con una propiedad indizada.Para obtener información acerca de las funciones currificadas, vea Funciones (F#).
Ejemplo
En el ejemplo de código siguiente, se muestran la definición y el uso de las propiedades indizadas predeterminada y no predeterminada que tienen métodos set y get.
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
Propiedades indizadas con varias variables de índice
Las propiedades indizadas pueden tener más de una variable de índice.En ese caso, las variables se separan por comas cuando se utiliza la propiedad.El método set de este tipo de propiedad debe tener dos argumentos currificados, el primero de ellos es una tupla que contiene las claves, y el segundo es el valor que se va a establecer.
En el código siguiente se muestra el uso de una propiedad indizada con varias variables de índice.
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