Поиск…


замечания

Во всех случаях при расширении типов и модулей расширяющийся код должен быть добавлен / загружен перед кодом, который должен его вызвать. Он также должен быть доступен для вызывающего кода путем открытия / импорта соответствующих пространств имен.

Добавление новых методов / свойств в существующие типы

F # позволяет добавлять функции как «члены» к типам, когда они определены (например, типы записей ). Однако F # также позволяет добавлять новые члены экземпляра в существующие типы - даже те, которые объявлены в другом месте и на других языках .net.

Следующий пример добавляет новый метод экземпляра. Duplicate все экземпляры String .

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

Примечание : this произвольно выбранное имя переменной, которое будет использоваться для ссылки на экземпляр расширяемого типа - x будет работать так же хорошо, но, возможно, будет менее самоописательным.

Затем он может быть вызван следующими способами.

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

Эта функциональность очень похожа на методы расширения в C #.

Аналогичным образом к существующим типам можно добавлять новые свойства. Они автоматически станут свойствами, если новый член не принимает аргументов.

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

Добавление новых статических функций в существующие типы

F # позволяют расширить существующие типы с помощью новых статических функций.

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

Эта новая функция может быть вызвана следующим образом:

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

Эта функция может означать, что вместо того, чтобы создавать «полезные» библиотеки функций, они могут быть добавлены к соответствующим существующим типам. Это может быть полезно для создания более функциональных версий функций F #, которые позволяют использовать такие функции, как 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

Добавление новых функций в существующие модули и типы с использованием модулей

Модули могут использоваться для добавления новых функций в существующие модули и типы.

namespace FSharp.Collections

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

Новая функция может быть вызвана так, как если бы она была оригинальным членом 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow