수색…


비고

모든 유형과 모듈을 확장 할 때 확장 코드는 호출 할 코드 앞에 추가 /로드되어야합니다. 또한 관련 네임 스페이스를 열거 나 가져 와서 호출 코드에서 사용할 수 있어야합니다.

기존 유형에 새 메소드 / 특성 추가

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

이 기능은 함수의 "유틸리티"라이브러리를 생성하지 않고 관련된 기존 유형에 추가 할 수 있음을 의미합니다. 이는 currying 과 같은 기능을 허용하는 더 많은 F # 친화적 인 함수 버전을 만드는 데 유용 할 수 있습니다.

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