0

コードでアクションの前に破棄する理由を理解するために作成した簡単なスニペットを次に示します。

type IType = 
    inherit IDisposable
    abstract say : string -> unit

let St = {
    new IType with
        member i.say hi     = Console.Write hi
        member i.Dispose()  = Console.Write "So I disposed"
    }

let Say1(cmon : IType) =
    using   <| cmon
            <| fun lol -> lol.say

Say1 St " :( " // So I disposed :(

printfn ""

let Say2(cmon : IType) (smile : string) =
    using   <| cmon
            <| fun lol -> lol.say smile

Say2 St " :) " // :) So I disposed

ここで 2 つの質問があります。

  • St最初の呼び出しで正確にどこに配置されますか?
  • 「ファジー」な方法でパラメーターを渡す構文の方法はありますが、壊れませんIDisposableか?

printf に似たパラメーターを渡したいのですが、それがカウントであることがわかりません。

4

1 に答える 1

2

Dispose 対応するSayNものが終了すると呼び出されます。

最初のケースでは、関数は終了し (したがって dispose が呼び出されます)、タイプの関数を返します。この関数はstring -> ()実行され、その結果を出力します。

2 番目のケースでは、結果が出力されてから関数が終了します (したがって、文字列がコンソールに出力された後に Dispose が呼び出されます)。

最良の解決策は、パラメーターにDUを使用することだと思います-したがって、定義します

type t = |N |S of string ... //for all possible cases

次に、関数に型の引数をとらせるだけですt

于 2013-04-29T08:05:02.143 に答える