ホームページ > バックエンド開発 > C++ > ラムダ式が反復変数の最終値を取得するのはなぜですか?

ラムダ式が反復変数の最終値を取得するのはなぜですか?

Barbara Streisand
リリース: 2025-01-14 12:26:43
オリジナル
429 人が閲覧しました

Why Do Lambda Expressions Capture the Final Value of Iteration Variables?

ラムダ式で反復変数を使用する場合の潜在的な落とし穴

プログラミングの分野では、ラムダ式は匿名関数を表す簡潔な方法を提供します。ただし、ラムダ式で反復変数を使用すると、予期しない結果が生じる可能性があります。

次のコードを考えてみましょう:

<code class="language-c#">List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action action in actions)
{
    action();
}</code>
ログイン後にコピー

このコードは、誤ってすべての Lambda 式を同じ反復変数 i に関連付けます。したがって、各 Lambda 式が実行されるときは、Lambda が作成されたときの i の期待値ではなく、i の最終値を参照します。

その結果、出力が期待どおりにならない可能性があります。予想どおり 0 から 9 を出力する代わりに、コードは 10 を 10 回出力します。この動作は、関与するすべてのデリゲートが単一の変数をキャプチャすることに起因することに注意してください。

この予期しない結果を回避するには、ループ内にローカル変数を作成し、それに反復変数の値を割り当てることをお勧めします。このようにして、各ラムダ式は異なるローカル変数を参照し、期待値が確実に保持されるようにします。 変更されたコードは次のとおりです:

<code class="language-c#">List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    int temp = i; // 创建局部变量
    actions.Add(() => Console.WriteLine(temp));
}

foreach (Action action in actions)
{
    action();
}</code>
ログイン後にコピー

このようにして、各 Lambda 式は独立した temp 変数をキャプチャするため、変数値が上書きされる問題が回避され、最終的な出力には 0 から 9 が正しく表示されます。

以上がラムダ式が反復変数の最終値を取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート