Ricerca…


Osservazioni

In tutti i casi durante l'estensione di tipi e moduli, il codice di estensione deve essere aggiunto / caricato prima del codice che deve chiamarlo. Deve anche essere reso disponibile al codice chiamante aprendo / importando i namespace rilevanti.

Aggiunta di nuovi metodi / proprietà a tipi esistenti

F # consente di aggiungere funzioni come "membri" ai tipi quando vengono definiti (ad esempio, Tipi di record ). Tuttavia, F # consente anche ai nuovi membri dell'istanza di essere aggiunti a tipi esistenti - anche quelli dichiarati altrove e in altre lingue .net.

L'esempio seguente aggiunge un nuovo metodo di istanza Duplicate a tutte le istanze di String .

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

Nota : this è un nome di variabile scelto arbitrariamente da usare per riferirsi all'istanza del tipo che viene esteso - x funzionerebbe altrettanto bene, ma forse sarebbe meno descrittivo.

Può quindi essere chiamato nei seguenti modi.

// 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

Questa funzionalità è molto simile ai Metodi di estensione in C #.

Le nuove proprietà possono anche essere aggiunte ai tipi esistenti allo stesso modo. Diventeranno automaticamente proprietà se il nuovo membro non accetta argomenti.

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

Aggiunta di nuove funzioni statiche ai tipi esistenti

F # consente di estendere i tipi esistenti con nuove funzioni statiche.

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

Questa nuova funzione può essere invocata in questo modo:

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

Questa caratteristica può significare che piuttosto che dover creare librerie "di utilità" di funzioni, possono essere aggiunte a tipi esistenti pertinenti. Questo può essere utile per creare più versioni compatibili con F # delle funzioni che consentono funzionalità come il currying .

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

Aggiunta di nuove funzioni a moduli e tipi esistenti tramite moduli

I moduli possono essere utilizzati per aggiungere nuove funzioni a moduli e tipi esistenti.

namespace FSharp.Collections

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

La nuova funzione può quindi essere chiamata come se fosse un membro originale di List.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow