수색…
비고
모든 유형과 모듈을 확장 할 때 확장 코드는 호출 할 코드 앞에 추가 /로드되어야합니다. 또한 관련 네임 스페이스를 열거 나 가져 와서 호출 코드에서 사용할 수 있어야합니다.
기존 유형에 새 메소드 / 특성 추가
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"