Szukaj…


Uwagi

We wszystkich przypadkach rozszerzania typów i modułów, kod rozszerzający musi zostać dodany / załadowany przed kodem, który ma go wywołać. Należy go również udostępnić kodowi wywołującemu poprzez otwarcie / zaimportowanie odpowiednich przestrzeni nazw.

Dodanie nowych metod / właściwości do istniejących typów

F # pozwala na dodawanie funkcji jako „członków” do typów, gdy są one zdefiniowane (na przykład typy rekordów ). Jednak F # pozwala również dodawać nowych członków instancji do istniejących typów - nawet tych zadeklarowanych gdzie indziej i w innych językach .net.

Poniższy przykład dodaje nową metodę instancji Duplicate do wszystkich instancji String .

type System.String with
    member this.Duplicate times = 
        Array.init times (fun _ -> this)

Uwaga: this jest dowolnie wybrana nazwa zmiennej użyć, aby odnieść się do instancji typu, który jest przedłużony - x będzie działać tak samo dobrze, ale może być mniej self-opisywania.

Można go następnie wywołać w następujący sposób.

// F#-style call
let result1 = "Hi there!".Duplicate 3

// C#-style call
let result2 = "Hi there!".Duplicate(3)

// Both result in three "Hi there!" strings in an array

Ta funkcjonalność jest bardzo podobna do metod rozszerzeń w języku C #.

Nowe właściwości można również dodawać do istniejących typów w ten sam sposób. Staną się automatycznie właściwościami, jeśli nowy członek nie przyjmie argumentów.

type System.String with
    member this.WordCount =
        ' ' // Space character
        |> Array.singleton
        |> fun xs -> this.Split(xs, StringSplitOptions.RemoveEmptyEntries)
        |> Array.length

let result = "This is an example".WordCount
// result is 4

Dodanie nowych funkcji statycznych do istniejących typów

F # pozwala na rozszerzenie istniejących typów o nowe funkcje statyczne.

type System.String with
    static member EqualsCaseInsensitive (a, b) = String.Equals(a, b, StringComparison.OrdinalIgnoreCase)

Tę nową funkcję można wywołać w następujący sposób:

let x = String.EqualsCaseInsensitive("abc", "aBc")
// result is True

Ta funkcja może oznaczać, że zamiast tworzyć biblioteki funkcji, można je dodawać do odpowiednich istniejących typów. Może to być przydatne do tworzenia bardziej przyjaznych dla F # wersji funkcji, które umożliwiają takie funkcje, jak curry .

type System.String with
    static member AreEqual comparer a b = System.String.Equals(a, b, comparer)

let caseInsensitiveEquals = String.AreEqual StringComparison.OrdinalIgnoreCase

let result = caseInsensitiveEquals "abc" "aBc"
// result is True

Dodanie nowych funkcji do istniejących modułów i typów za pomocą modułów

Modułów można używać do dodawania nowych funkcji do istniejących modułów i typów.

namespace FSharp.Collections

module List =
    let pair item1 item2 = [ item1; item2 ]

Nowa funkcja może być następnie wywołana tak, jakby była oryginalnym członkiem listy.

open FSharp.Collections    

module Testing =
    let result = List.pair "a" "b"
    // result is a list containing "a" and "b"


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow