F#
Estensioni di tipo e modulo
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"