F # - Delegasi
Delegasi adalah variabel jenis referensi yang menyimpan referensi ke suatu metode. Referensi dapat diubah saat runtime. Delegasi F # mirip dengan pointer ke fungsi, di C atau C ++.
Mendeklarasikan Delegasi
Deklarasi delegasi menentukan metode yang bisa direferensikan oleh delegasi. Seorang delegasi bisa merujuk ke sebuah metode, yang memiliki tanda tangan yang sama dengan yang dimiliki delegasi tersebut.
Sintaks untuk deklarasi delegasi adalah -
type delegate-typename = delegate of type1 -> type2
Misalnya, pertimbangkan para delegasi -
// Delegate1 works with tuple arguments.
type Delegate1 = delegate of (int * int) -> int
// Delegate2 works with curried arguments.
type Delegate2 = delegate of int * int -> int
Kedua delegasi dapat digunakan untuk mereferensikan metode apa pun yang memiliki dua parameter int dan mengembalikan variabel tipe int .
Dalam sintaks -
type1 mewakili tipe argumen.
type2 mewakili tipe pengembalian.
Harap diperhatikan -
Tipe argumen secara otomatis diambil.
Delegasi dapat dilampirkan ke nilai fungsi, dan metode statis atau contoh.
Nilai fungsi F # dapat dikirimkan secara langsung sebagai argumen untuk mendelegasikan konstruktor.
Untuk metode statis, delegasi dipanggil dengan menggunakan nama kelas dan metode. Untuk metode instance, nama instance objek dan metode digunakan.
Metode Panggil pada tipe delegasi memanggil fungsi yang dienkapsulasi.
Selain itu, delegasi dapat dikirimkan sebagai nilai fungsi dengan mereferensikan nama metode Panggil tanpa tanda kurung.
Contoh berikut menunjukkan konsep -
Contoh
type Myclass() =
static member add(a : int, b : int) =
a + b
static member sub (a : int) (b : int) =
a - b
member x.Add(a : int, b : int) =
a + b
member x.Sub(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( Myclass.add )
let del2 : Delegate2 = new Delegate2( Myclass.sub )
let mc = Myclass()
// For instance methods, use the instance value name, the dot operator,
// and the instance method name.
let del3 : Delegate1 = new Delegate1( mc.Add )
let del4 : Delegate2 = new Delegate2( mc.Sub )
for (a, b) in [ (400, 200); (100, 45) ] 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)
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
400 + 200 = 600
400 - 200 = 200
400 + 200 = 600
400 - 200 = 200
100 + 45 = 145
100 - 45 = 55
100 + 45 = 145
100 - 45 = 55