gpt4 book ai didi

f# - 是否可以在 F# 中定义通用扩展方法?

转载 作者:行者123 更新时间:2023-12-04 18:16:00 26 4
gpt4 key购买 nike

我试图将 Rhino Mocks 与 F# 代码一起使用,但以下代码存在问题:

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

这并不奇怪,因为 Stub 不是 IMyService 接口(interface)的一部分,它是 Rhino Mocks 定义的 C# 扩展方法。

稍微修改的代码有效:
let service = MockRepository.GenerateMock<IMyService>()
RhinoMocksExtensions.Stub<IMyService, string>(service, fun s -> s.Name).Return("Service");

但是,在 F# 中定义一个扩展方法会很好,但是它将是一个参数化的通用扩展方法,它需要一个 tuple 。我正在尝试各种语法,但没有任何运气。我没有找到 F# 当前是否支持此功能的信息。如果有人知道,请告诉我。

最佳答案

正如 kvb 所提到的,这在 F# 2.0 中是不可能的。在这种特殊情况下,我将包装 Rhino.Mocks 流利的接口(interface)以使其在 F# 中更加惯用,例如:

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. (对不起插件,但我真的认为它在这里相关)

关于f# - 是否可以在 F# 中定义通用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3381570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com