Buscar..


Observaciones

En todos los casos, cuando se extienden tipos y módulos, el código de extensión se debe agregar / cargar antes del código que debe llamarse. También debe estar disponible para el código de llamada abriendo / importando los espacios de nombres relevantes.

Agregando nuevos métodos / propiedades a los tipos existentes

F # permite que las funciones se agreguen como "miembros" a los tipos cuando se definen (por ejemplo, Tipos de registro ). Sin embargo, F # también permite agregar nuevos miembros de instancia a los tipos existentes , incluso los declarados en otros lugares y en otros idiomas .net.

El siguiente ejemplo agrega un nuevo método de instancia Duplicate a todas las instancias de String .

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

Nota : this es un nombre de variable elegido arbitrariamente para usar para referirse a la instancia del tipo que se está extendiendo: x funcionaría igual de bien, pero quizás sea menos autodeclarado.

Entonces se puede llamar de las siguientes maneras.

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

Esta funcionalidad es muy similar a los métodos de extensión en C #.

Las nuevas propiedades también se pueden agregar a los tipos existentes de la misma manera. Se convertirán automáticamente en propiedades si el nuevo miembro no toma argumentos.

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

Añadiendo nuevas funciones estáticas a los tipos existentes.

F # permite que los tipos existentes se amplíen con nuevas funciones estáticas.

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

Esta nueva función se puede invocar así:

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

Esta característica puede significar que, en lugar de tener que crear bibliotecas de funciones "de utilidad", se pueden agregar a los tipos existentes relevantes. Esto puede ser útil para crear más versiones amigables con F # de funciones que permitan funciones como el 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

Agregar nuevas funciones a los módulos y tipos existentes usando módulos

Los módulos se pueden usar para agregar nuevas funciones a los módulos y tipos existentes.

namespace FSharp.Collections

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

La nueva función se puede llamar como si fuera un miembro original de la Lista.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow