F # - Đại biểu
Một đại biểu là một biến kiểu tham chiếu chứa tham chiếu đến một phương thức. Tham chiếu có thể được thay đổi trong thời gian chạy. Các đại biểu F # tương tự như các con trỏ đến các hàm, trong C hoặc C ++.
Tuyên bố đại biểu
Khai báo ủy quyền xác định các phương thức có thể được tham chiếu bởi đại biểu. Một đại biểu có thể tham chiếu đến một phương thức có cùng chữ ký với của đại biểu.
Cú pháp khai báo ủy quyền là:
type delegate-typename = delegate of type1 -> type2
Ví dụ, hãy xem xét các đại biểu -
// Delegate1 works with tuple arguments.
type Delegate1 = delegate of (int * int) -> int
// Delegate2 works with curried arguments.
type Delegate2 = delegate of int * int -> int
Cả hai đại diện đều có thể được sử dụng để tham chiếu bất kỳ phương thức nào có hai tham số int và trả về một biến kiểu int .
Trong cú pháp -
type1 đại diện cho (các) loại đối số.
type2 đại diện cho kiểu trả về.
Xin lưu ý -
Các loại đối số được tự động xử lý.
Các đại biểu có thể được đính kèm với các giá trị hàm và các phương thức tĩnh hoặc thể hiện.
Giá trị hàm F # có thể được truyền trực tiếp dưới dạng đối số để ủy quyền các hàm tạo.
Đối với một phương thức tĩnh, ủy nhiệm được gọi bằng cách sử dụng tên của lớp và phương thức. Đối với một phương thức thể hiện, tên của thể hiện đối tượng và phương thức được sử dụng.
Phương thức Gọi trên kiểu đại biểu gọi hàm được đóng gói.
Ngoài ra, các đại biểu có thể được chuyển dưới dạng giá trị hàm bằng cách tham chiếu đến tên phương thức Gọi mà không có dấu ngoặc đơn.
Ví dụ sau thể hiện khái niệm -
Thí dụ
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)
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
400 + 200 = 600
400 - 200 = 200
400 + 200 = 600
400 - 200 = 200
100 + 45 = 145
100 - 45 = 55
100 + 45 = 145
100 - 45 = 55