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"


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow