7

私には、以下で説明されているような既存の値のシャドーイング:


F# で不変のシャドウイングとネストされた関数
f# 重複定義
FSharp 楽しみと利益のためのコメント

F# を非常に強力なものにしている不変性と型安全性の概念に反しているようです。F# でのシャドウイングは、C# とは異なります。私のコードのバグが、同じスコープ内の名前の意図しないシャドウイングによるものであることが判明するまで、かなりの時間がかかりました。VS で値をシャドーイングするためのコンパイラ警告を表示する方法はありますか?

場合によってはそれが役立つことも知っています。たとえば、Checked Aritmeticsの場合。

4

2 に答える 2

5

私がシャドウイングを使用する場所の 1 つは、値が指定されていない場合にオプションのパラメーターをデフォルト値に解決するときです。

member x.Foo(?myFlag: bool) =
    let myFlag = defaultArg myFlag false
    ...

また、現在の実装方法である F# Interactive は、シャドウイングがなければまったく機能しません。

于 2014-06-24T16:38:34.990 に答える
3

シャドウイングには長所と短所があります。私も、太い指によるシャドーイングの努力により、バグに遭遇しました。プラス面では、@ JoelMueller が指摘したように、変数スペースをきれいに保つのに役立ちます。

シャドウイングのバグは、可変変数のバグとは根本的に異なります。それらはタイプミスの種類です。それらは分析がはるかに簡単です。履歴情報の損失は、辞書編集コンテキストと環境コンテキストに対して最小限に抑えられます。つまり、シャドーイングを使用すると、メンタル スタックのアンローリングを通じてバインドの値を常にきれいにトレースできますが、変数のミューテーションは本質的に goto (アドレスへのジャンプ) を作成します。

実際には、シャドーイングは依然としてバグのクラス全体を排除します。「遠くからの不気味なアクション」に遭遇することはありません。つまり、変数がクロージャーでキャプチャされたり、変数が現在のスコープに対してネストされたスコープで変更されたりするという問題に遭遇することはありません。

于 2014-06-24T17:00:32.670 に答える