2

後でIDisposable処理する必要がある s が大量にあるため、使い捨てのリストとパススルー関数を設定して、副作用として項目をリストに追加します。

let mutable disposables = []
let (~-) (x:'a) = disposables <- x :: disposables; x

うまくいけばこれができるように:

let thing1 = -new Form()
let thing2 = -new Control()

for i in disposables do i.Dispose()

問題は、F# が に自動的に制約'aIDisposable、次の警告メッセージが表示されることです。

この構成により、コードは型注釈で示されるよりも一般的ではなくなります。型変数 'a は型 'IDisposable' に制限されています。

そのため、戻り値の型operator ~-が IDisposable になり、関数の利便性が損なわれます。

F# がこの制約を作成しないようにする方法はありますか?

4

2 に答える 2

2

とった!

答えは、関数の型シグネチャではなく、関数で使用するときにxアップキャストすることです。IDisposable

let mutable disposables = []
let (~-) x = disposables <- (x :> IDisposable) :: disposables; x
于 2012-07-28T01:13:33.560 に答える
1

コードに関する一般的なアドバイスは求めていませんが、いくつかの奇妙な点を指摘しなければならないと感じています。

まず、 を呼び出す必要はほとんどありませんDispose()useリソースを管理する標準的な方法です。おそらくこれを行う必要があります:

use thing1 = new Form()
use thing2 = new Control()

mutable第二に、なぜ不変のデータ構造を変数に割り当てるのでしょうか? リソースを手動で追跡する必要があると確信している場合は、

let disposables = ResizeArray<IDisposable>()

最後に、自身のスコープ外の変数を変更する演算子を定義する前に、十分に検討する必要があります。これは、オペレーターにとって異常な動作です (オペレーターの範囲が非常に狭い場合を除きます)。

于 2012-07-28T03:38:28.183 に答える