値を割り当てずにF#で新しい変数を宣言する方法はありますか?
5 に答える
Aidanのコメントを参照してください。
あなたが主張するならば、あなたはこれをすることができます:
let mutable x = Unchecked.defaultof<int>
これにより、絶対零度の値が割り当てられます(0
数値型の場合null
、参照型の場合、値型の場合はstruct-zero)。
作成者がF#でこれを必要とする理由を知ることは興味深いでしょう(使用目的の簡単な例で十分です)。
しかし、C#で初期化されていない変数を使用する可能性がout
ある一般的なケースの1つは、パラメーターを指定して関数を呼び出す場合だと思います。
TResult Foo<TKey, TResult>(IDictionary<TKey, TResult> dictionary, TKey key)
{
TResult value;
if (dictionary.TryGetValue(key, out value))
{
return value;
}
else
{
throw new ApplicationException("Not found");
}
}
幸いなことに、F#では、はるかに優れた構文を使用してこの状況を処理できます。
let foo (dict : IDictionary<_,_>) key =
match dict.TryGetValue(key) with
| (true, value) -> value
| (false, _) -> raise <| ApplicationException("Not Found")
明示的なフィールド構文を使用することもできます。
type T =
val mutable x : int
私は「やらないでください」と言ったすべての人に同意します。ただし、本当に必要な場合に自分がいると確信している場合は、次のようにすることができます。
let mutable naughty : int option = None
...後で値を割り当てます。
naughty <- Some(1)
ただし、「代わりにアプローチを変更する」と言った人はおそらく正しいことを覚えておいてください。私はF#でフルタイムでコーディングしており、割り当てられていない「変数」を宣言する必要はありませんでした。
もう1つのポイント:F#を使用するのはあなたの選択ではなかったとあなたは言いますが、F#を使用することはすぐに幸運だと思うでしょう!
F#変数はデフォルトで不変であるため、後で値を割り当てることはできません。したがって、初期値なしでそれらを宣言すると、それらはまったく役に立たなくなり、そのため、そうするメカニズムはありません。
おそらく、可変変数宣言は初期値なしで宣言でき、それでも有用です(C#変数のように初期デフォルトを取得できます)が、F#の構文はこれをサポートしていません。これは一貫性のためであり、可変可変スロットは慣用的なF#ではないため、それらをサポートするための特別なケースを作成するインセンティブはほとんどないと思います。