2010-08-01 29 views
5

Tôi đã cố gắng sử dụng Rhino Mocks với F # mã, và đoạn mã sau là một vấn đề:Có thể xác định phương pháp mở rộng chung trong F # không?

let service = MockRepository.GenerateMock<IMyService>() 
service.Stub(s => s.Name).Return("Service"); 

Đây không phải là bất ngờ, kể từ Stub không phải là một phần của giao diện IMyService, đó là một C# mở rộng phương pháp mà Rhino Mocks định nghĩa.

đang

Slighltly sửa đổi hoạt động:

let service = MockRepository.GenerateMock<IMyService>() 
RhinoMocksExtensions.Stub<IMyService, string>(service, fun s -> s.Name).Return("Service"); 

Tuy nhiên, nó sẽ được tốt đẹp để xác định một phương pháp khuyến nông trong F #, nhưng sau đó nó sẽ là một phương pháp khuyến nông chung tham số đó sẽ mất một tuple. Tôi đã cố gắng varios cú pháp nhưng không có bất kỳ may mắn. Tôi không tìm thấy thông tin cho dù điều này hiện đang được hỗ trợ trong F # hay không. Nếu ai đó biết, xin hãy cho tôi biết.

Trả lời

3

Nếu tôi hiểu chính xác câu hỏi của bạn, câu trả lời là không. Section 8.12.1 of the spec (nhập khẩu C# Extensions viên) bao gồm văn bản này:

C# -defined thành viên mở rộng được thực hiện sẵn cho F # mã trong môi trường nơi lắp ráp C# -authored là tham chiếu và khai mở của không gian tên tương ứng đang ở hiệu ứng . Tuy nhiên, một số hạn chế áp dụng, đặc biệt là các thành viên # mở rộng

  • C mà “này” tham số là một kiểu dữ liệu không tạo sẵn cho F # mã trong phiên bản này của F #

  • thành viên mở rộng C# có tham số "này" là loại mảng không phải là được cung cấp cho mã F # trong phiên bản này của F #

Điều này giải thích tại sao một số phương pháp mở rộng từ C# sẽ hoạt động (ví dụ: những người trong System.Linq), trong khi một trong những bạn đang cố gắng sử dụng sẽ không.

Hơn nữa, các phương pháp mở rộng F # gốc chỉ có thể được định nghĩa như thể chúng được đặt trên các định nghĩa kiểu thực tế. Cụ thể, bạn không thể xác định phương pháp mở rộng F # trên loại chung đóng (ví dụ: IEnumerable<string>) hoặc bạn cũng không thể xác định phương pháp tiện ích mở rộng trên biến loại chung.

+0

Cảm ơn bạn đã câu trả lời! –

4

Như kvb đã đề cập, không thể thực hiện được trong F # 2.0. Trong trường hợp này tôi muốn quấn Rhino.Mocks giao diện thông thạo để làm cho nó nhiều thành ngữ trong F #, ví dụ:

let mstub f target = 
    RhinoMocksExtensions.Stub(target, Function(f)) 

let mreturn value (options: IMethodOptions<'a>) = 
    options.Return value 

let service = MockRepository.GenerateMock<IComparer>() 
service |> mstub (fun s -> s.Compare(1,2)) |> mreturn 1 |> ignore 

What's fluent in one language is not necessarily fluent in another. (xin lỗi vì các plug nhưng tôi thực sự nghĩ rằng nó có liên quan ở đây)

+0

Marurcio, Cảm ơn bạn đã giải thích. Vâng, tôi cũng đã đi đến cùng một kết luận rằng các phần mở rộng như vậy khá hữu ích trong C# sẽ không mang lại nhiều giá trị cho F #, và có những cách khác (và tốt hơn) để thể hiện điều này trong F #. –

Các vấn đề liên quan