F# 接口语法,用于声明具有 byref 返回对象(或元组)的函数,如 Int32.TryParse



我找不到如何在接口中声明函数,以便我有一个元组或 byref 结果。
我想模拟这种语法:

let executed, value = Int32.TryParse("123") 

假设我有一个带有 2 个输入参数的函数,我想知道结果是否成功以及是否有结果(在本例中为 Record 类型(。 有点:

type Result = {reference:string; value:decimal}
type IExecutor =
abstract member DoStuff: (aa:string) * (bb:string) * (result:byref<Result>) -> bool
abstract member DoStuff: (aa:string, bb:string, result:byref<Result>) -> bool
type Executor () =
member this.DoStuff (aa:string, bb:string, result:byref<Result>):bool =
result <- {reference="ref"; value=0m}
false

let executed, result = executor.DoStuff "aa" "bb"
or 
let executed, result = executor.DoStuff("aa", "bb")

我无法在界面中声明DoStuff。
第二次尝试是我从智能感知中看到的Int32.TryParse签名的副本,为什么不起作用?
随心所欲地调用DoStuff的正确语法是什么?

首先,要声明一个接口,你使用抽象成员,你只应用签名

type IExecutor =
abstract member DoStuff: string*string*outref<int>->bool 

如果要实现接口,则如下所示

type Executor() =
interface IExecutor with
member this.DoStuff  (a:string,b:string,result:outref<int>) : bool =
result <- 3
true

你可以这样称呼它

let s = new Executor() :> IExecutor
let a,b = s.DoStuff ( "lorem" "ipsum" )

话虽如此,如果您仅从 F# 使用它,请避免使用元组:

type IExecutor =
abstract member DoStuff: string->string->bool*int
type Executor() =
interface IExecutor with
member this.DoStuff  (a:string) (b:string)  : bool*int =
true,3
let s = new Executor() :> IExecutor
let a,b = s.DoStuff "lorem" "ipsum"

最新更新