2017-04-12 13 views
6

F # cho phép chức năng để chỉ khác nhau bởi một tham số tùy chọn, ví dụ quá tải?Phân biệt giữa f # chức năng quá tải với các thông số tùy chọn

+1

bạn chỉ có thể đổi tên tham số thứ hai trong bất kỳ chức năng: 'kiểu MyClass() = viên this.func (một : string, b: string) = "func (a, b)" thành viên this.func (a: string,? c: string) = "func (a,? c)" let test = MyClass() let arg1 = "2" cho arg2 = "12" test.func (arg1, b = arg2) |> printfn "% s" // func (a, b) test.func (arg1, c = arg2) |> printfn "% s" // func (a,? c) ' –

Trả lời

8

Tôi không nghĩ rằng có một cách hợp lý để gọi hàm đầu tiên nếu hai hàm quá tải chỉ khác nhau theo tham số tùy chọn. Như đã đề cập trong các ý kiến, sử dụng này có lẽ là một thiết kế kém và bạn nên đổi tên các tham số.

Như bạn có thể nhận thấy, khi bạn cố gắng gọi hàm một cách bình thường sử dụng MyClass().func("A","B"), bạn nhận được một thông báo lỗi phàn nàn về sự nhập nhằng:

lỗi FS0041: Một tình trạng quá tải duy nhất cho phương pháp 'func' could không được xác định dựa trên thông tin loại trước điểm chương trình này. Có thể cần chú thích loại. Ứng viên: thành viên MyClass.func: a: string *? B: string -> string, thành viên MyClass.func: a: string * b: string -> string

Bạn có thể gọi quá tải thứ hai một cách rõ ràng theo hai cách (có hoặc không có ?b) nhờ vào sự thật rằng bạn rõ ràng có thể cung cấp Some giá trị cho một đối số tùy chọn:

MyClass().func("A") 
MyClass().func("A",?b=Some "B") 

ra khỏi tò mò, nó chỉ ra rằng bạn có thể gọi quá tải đầu tiên thông qua một chế thành viên tĩnh. Điều này khá xấu xí và có lẽ bạn không nên làm điều này, nhưng nó gọi là tình trạng quá tải đầu tiên:

let inline callFunc (o:^T) a b = 
    (^T : (member func : string * string -> string) (o, a, b)) 

callFunc (MyClass()) "A" "B" 
Các vấn đề liên quan