我找不到如何在接口中声明函数,以便我有一个元组或 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"