F#
Type- en module-uitbreidingen
Zoeken…
Opmerkingen
In alle gevallen bij het uitbreiden van typen en modules, moet de uitbreidingscode worden toegevoegd / geladen vóór de code die deze moet aanroepen. Het moet ook beschikbaar worden gesteld aan de belcode door de betreffende naamruimten te openen / importeren .
Nieuwe methoden / eigenschappen toevoegen aan bestaande typen
Met F # kunnen functies worden toegevoegd als "leden" aan typen wanneer deze zijn gedefinieerd (bijvoorbeeld Recordtypen ). Met F # kunnen echter ook nieuwe instantieleden worden toegevoegd aan bestaande typen - zelfs degenen die elders en in andere .net-talen worden gedeclareerd.
In het volgende voorbeeld wordt een nieuwe instantiemethode Duplicate
aan alle instanties van String
.
type System.String with
member this.Duplicate times =
Array.init times (fun _ -> this)
Opmerking : this
is een willekeurig gekozen variabelenaam om te gebruiken om te verwijzen naar de instantie van het type dat wordt uitgebreid - x
zou net zo goed werken, maar zou misschien minder zichzelf beschrijven.
Het kan dan op de volgende manieren worden opgeroepen.
// 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
Deze functionaliteit lijkt erg op Extension Methods in C #.
Nieuwe eigenschappen kunnen ook op dezelfde manier aan bestaande types worden toegevoegd. Ze worden automatisch eigenschappen als het nieuwe lid geen argumenten aanneemt.
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
Nieuwe statische functies toevoegen aan bestaande typen
Met F # kunnen bestaande typen worden uitgebreid met nieuwe statische functies.
type System.String with
static member EqualsCaseInsensitive (a, b) = String.Equals(a, b, StringComparison.OrdinalIgnoreCase)
Deze nieuwe functie kan als volgt worden aangeroepen:
let x = String.EqualsCaseInsensitive("abc", "aBc")
// result is True
Deze functie kan betekenen dat in plaats van het maken van "utility" -bibliotheken van functies, ze kunnen worden toegevoegd aan relevante bestaande typen. Dit kan handig zijn om meer F # -vriendelijke versies van functies te maken die functies zoals curry mogelijk maken .
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
Nieuwe functies toevoegen aan bestaande modules en types met behulp van modules
Modules kunnen worden gebruikt om nieuwe functies toe te voegen aan bestaande modules en types.
namespace FSharp.Collections
module List =
let pair item1 item2 = [ item1; item2 ]
De nieuwe functie kan dan worden aangeroepen alsof het een origineel lid van Lijst was.
open FSharp.Collections
module Testing =
let result = List.pair "a" "b"
// result is a list containing "a" and "b"