F#
Typ i rozszerzenia modułów
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"