F#
Расширения типа и модуля
Поиск…
замечания
Во всех случаях при расширении типов и модулей расширяющийся код должен быть добавлен / загружен перед кодом, который должен его вызвать. Он также должен быть доступен для вызывающего кода путем открытия / импорта соответствующих пространств имен.
Добавление новых методов / свойств в существующие типы
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"