Стоит добавить, что F # также поддерживает синтаксис срезов (который не упомянут на индексированных свойствах на странице MSDN) Это означает, что вы можете индексировать не только один элемент, такой как m.[0]
, но также и фрагмент, такой как m.[0..5]
или неограниченный диапазон m.[5..]
. Это очень полезно для различных числовых типов данных (таких как матрицы).
Для поддержки этой функции тип должен определять метод GetSlice
. Следующий пример демонстрирует это с использованием 2D-сценария:
type Foo() =
member x.GetSlice(start1, finish1, start2, finish2) =
let s1, f1 = defaultArg start1 0, defaultArg finish1 0
let s2, f2 = defaultArg start2 0, defaultArg finish2 0
sprintf "%A, %A -> %A, %A" s1 s2 f1 f2
> let f = new Foo()
f.[1.., 1..10];;
val it : string = "1, 1 -> 0, 10"
Аргументы имеют тип int option
, и здесь мы используем defaultArg
, чтобы указать 0 в качестве значения по умолчанию.