9

値を割り当てずにF#で新しい変数を宣言する方法はありますか?

4

5 に答える 5

16

Aidanのコメントを参照してください。

あなたが主張するならば、あなたはこれをすることができます:

let mutable x = Unchecked.defaultof<int>

これにより、絶対零度の値が割り当てられます(0数値型の場合null、参照型の場合、値型の場合はstruct-zero)。

于 2012-06-18T15:57:30.757 に答える
8

作成者が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")
于 2012-06-19T07:34:11.073 に答える
7

明示的なフィールド構文を使用することもできます。

type T =
  val mutable x : int
于 2012-06-18T16:23:54.607 に答える
4

私は「やらないでください」と言ったすべての人に同意します。ただし、本当に必要な場合に自分がいると確信している場合は、次のようにすることができます。

let mutable naughty : int option = None

...後で値を割り当てます。

naughty <- Some(1)

ただし、「代わりにアプローチを変更する」と言った人はおそらく正しいことを覚えておいてください。私はF#でフルタイムでコーディングしており、割り当てられていない「変数」を宣言する必要はありませんでした。

もう1つのポイント:F#を使用するのはあなたの選択ではなかったとあなたは言いますが、F#を使用することはすぐに幸運だと思うでしょう!

于 2012-06-19T12:48:40.200 に答える
2

F#変数はデフォルトで不変であるため、後で値を割り当てることはできません。したがって、初期値なしでそれらを宣言すると、それらはまったく役に立たなくなり、そのため、そうするメカニズムはありません。

おそらく、可変変数宣言は初期値なしで宣言でき、それでも有用です(C#変数のように初期デフォルトを取得できます)が、F#の構文はこれをサポートしていません。これは一貫性のためであり、可変可変スロットは慣用的なF#ではないため、それらをサポートするための特別なケースを作成するインセンティブはほとんどないと思います。

于 2012-06-18T15:56:01.153 に答える