F # Реализовать оператор list [] для класса? - PullRequest
3 голосов
/ 22 апреля 2010

У меня есть собственный класс в F #, и я хочу реализовать оператор списка [] так, чтобы

let myClass = new myClassObj()
let someVal  = myClass.[2]

Кажется, я не могу найти это в Интернете - возможно, я не знаю подходящего термина для поиска ... заранее спасибо

Ответы [ 3 ]

5 голосов
/ 22 апреля 2010

Если вы начнете со справки по языку F # и перейдете к members , одна из тем будет indexed properties .

5 голосов
/ 22 апреля 2010

Стоит добавить, что 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 в качестве значения по умолчанию.

5 голосов
/ 22 апреля 2010

Вам просто нужно реализовать индексированное свойство Item.Например,

type MyClass() =
  member x.Item with get(i:int) = (* some logic involving i here *)
...