F# 向现有类型添加新方法/属性

示例

F#允许在定义函数时将它们作为“成员”添加到类型(例如,记录类型)。但是,F#还允许将新的实例成员添加到现有类型中,甚至可以是在其他地方和其他.net语言中声明的成员。

以下示例Duplicate向的所有实例添加了新的实例方法String。

typeSystem.Stringwith
    memberthis.Duplicatetimes = 
       Array.inittimes (fun _ -> this)

注意:this是一个任意选择的变量名,用于引用正在扩展的类型的实例-x会同样有效,但可能不那么自描述。

然后可以通过以下方式调用它。

// F#风格的通话
let result1 = "嗨,您好!".Duplicate 3

// C#样式的调用
let result2 = "嗨,您好!".Duplicate(3)

// Both result in three "嗨,您好!" strings in an array

此功能与C#中的扩展方法非常相似。

也可以以相同方式将新属性添加到现有类型。如果新成员不接受任何参数,它们将自动成为属性。

typeSystem.Stringwith
    memberthis.WordCount=
        ' ' // 空格字符
        |> Array.singleton
        |> fun xs -> this.Split(xs, StringSplitOptions.RemoveEmptyEntries)
        |> Array.length

let result = "This is an example".WordCount
// 结果是4