المفوضون (F#)

يمثل مفوض استدعاء دالة كـ كائن. في F#, يجب عادة استخدام دالة قيم إلى تمثل وظائف كقيم أول-class؛ ومع ذلك، تستخدم في.NET Framework التفويضات وهناك حاجة لذلك عندما تقوم بالتعامل مع واجهات برمجة التطبيقات التي تحتاج إليها. أنها أيضا قد استخدم d عند تأليف مكتبات تم تصميمها ل استخدم من اللغات الأخرى من برنامج.NET Framework.

type delegate-typename = delegate of type1 -> type2

ملاحظات

في بناء الجملة السابق، type1يمثل نوع وسيطة أو أنواع و type2يمثل نوع الإرجاع. أنواع وسيطة التي يتم تمثيلها بواسطة type1يتم تلقائياً curried. وهذا يقترح لهذا النوع من استخدام نموذج المجموعة إذا تم curried وسيطات دالة الهدف، و المجموعة parenthesized للوسائط الموجودة بالفعل في النموذج المجموعة. currying تلقائي إلى إزالة التعيين من الأقواس، مع ترك وسيطة الالتعيين تتوافق مع الهدف أسلوب. أرجع إلى تعليمات برمجية مثال لبناء الجملة الذي يجب أن تستخدم في كل حالة.

المفوضون يمكن إرفاقه إلى F# دالة قيم، وثابتة أو المثيل وظائف. يمكن أن تكون القيم دالة F# pكـsed مباشرة كـ الوسائط لتفويض المنشئات. لأسلوب ثابت، بناء تفويض باستخدام اسم الفئة والأسلوب. لمثيل أسلوب، تقوم بتوفير مثيل الكائن و أسلوب في وسيطة واحدة. في كلتا الحالتين، الوصول العضو عامل التشغيل ( .) هو المستخدمة.

Invokeالأسلوب تشغيل تفويض نوع استدعاء دالة مغلفة. أيضا، المفوضون يمكن تمرير كقيم دالة الإشارة إلى ‏‏اسم الأسلوب استدعاء بدون الأقواس.

يلي تعليمات برمجية يظهر بناء الجملة لإنشاء التفويضات التي تمثل الأساليب المختلفة في فئة. استناداً إلى ما إذا كان الأسلوب الذي هو أسلوب ثابت أو أسلوب مثيل، وكان لديه الوسيطات في النموذج المجموعة أو النموذج curried، بناء الجملة للتصريح وتعيين المفوض هو مختلفاً بعض الشيء.

type Test1() =
  static member add(a : int, b : int) =
     a + b
  static member add2 (a : int) (b : int) =
     a + b

  member x.Add(a : int, b : int) =
     a + b
  member x.Add2 (a : int) (b : int) =
     a + b


// Delegate1 works with tuple arguments.
type Delegate1 = delegate of (int * int) -> int
// Delegate2 works with curried arguments.
type Delegate2 = delegate of int * int -> int

let InvokeDelegate1 (dlg : Delegate1) (a : int) (b: int) =
   dlg.Invoke(a, b)
let InvokeDelegate2 (dlg : Delegate2) (a : int) (b: int) =
   dlg.Invoke(a, b)

// For static methods, use the class name, the dot operator, and the
// name of the static method.
let del1 : Delegate1 = new Delegate1( Test1.add )
let del2 : Delegate2 = new Delegate2( Test1.add2 )

let testObject = Test1()

// For instance methods, use the instance value name, the dot operator, and the instance method name.
let del3 : Delegate1 = new Delegate1( testObject.Add )
let del4 : Delegate2 = new Delegate2( testObject.Add2 )

for (a, b) in [ (100, 200); (10, 20) ] do
  printfn "%d + %d = %d" a b (InvokeDelegate1 del1 a b)
  printfn "%d + %d = %d" a b (InvokeDelegate2 del2 a b)
  printfn "%d + %d = %d" a b (InvokeDelegate1 del3 a b)
  printfn "%d + %d = %d" a b (InvokeDelegate2 del4 a b)

يلي تعليمات برمجية يعرض بعض الطرق المختلفة التي يمكنك التعامل مع التفويضات.

[F#]

type Delegate1 = delegate of int * char -> string

let replicate n c = String.replicate n (string c)

// An F# function value constructed from an unapplied let-bound function 
let function1 = replicate

// A delegate object constructed from an F# function value
let delObject = new Delegate1(function1)

// An F# function value constructed from an unapplied .NET member
let functionValue = delObject.Invoke

List.map (fun c -> functionValue(5,c)) ['a'; 'b'; 'c']
|> List.iter (printfn "%s")

// Or if you want to get back the same curried signature
let replicate' n c =  delObject.Invoke(n,c)

// You can pass a lambda expression as an argument to a function expecting a compatible delegate type
// System.Array.ConvertAll takes an array and a converter delegate that transforms an element from
// one type to another according to a specified function.
let stringArray = System.Array.ConvertAll([|'a';'b'|], fun c -> replicate' 3 c)
printfn "%A" stringArray

إخراج المثال السابق التعليمة البرمجية كما يلي.

aaaaa
bbbbb
ccccc
[|"aaa"; "bbb"|]

راجع أيضًا:

المبادئ

معلمات و وسيطات (F#)

موارد أخرى

مرجع لغة ب #

أحداث (F#)