Rumah > pembangunan bahagian belakang > C++ > Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Lelaran?

Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Lelaran?

Barbara Streisand
Lepaskan: 2025-01-14 12:26:43
asal
393 orang telah melayarinya

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

Potensi perangkap menggunakan pembolehubah lelaran dalam ungkapan Lambda

Dalam bidang pengaturcaraan, ungkapan Lambda menyediakan cara ringkas untuk mewakili fungsi tanpa nama. Walau bagaimanapun, menggunakan pembolehubah lelaran dalam ungkapan lambda boleh membawa kepada hasil yang tidak dijangka.

Pertimbangkan kod berikut:

<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>
Salin selepas log masuk

Kod ini secara tidak sengaja mengaitkan semua ungkapan Lambda dengan pembolehubah lelaran yang sama i. Oleh itu, apabila setiap ungkapan Lambda dilaksanakan, ia merujuk kepada nilai akhir i, bukan nilai jangkaan i apabila Lambda dicipta.

Akibatnya, output mungkin tidak seperti yang diharapkan. Daripada mencetak 0 hingga 9 seperti yang dijangkakan, kod tersebut mencetak 10 kali sepuluh kali. Perlu diingat bahawa tingkah laku ini terhasil daripada semua perwakilan yang terlibat menangkap pembolehubah tunggal.

Untuk mengelakkan hasil yang tidak dijangka ini, adalah disyorkan untuk mencipta pembolehubah setempat di dalam gelung dan menetapkan nilai pembolehubah lelaran kepadanya. Dengan cara ini, setiap ungkapan lambda merujuk pembolehubah tempatan yang berbeza, memastikan ia mengekalkan nilai yang dijangkakan. Kod yang diubah suai adalah seperti berikut:

<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>
Salin selepas log masuk

Dengan cara ini, setiap ungkapan Lambda akan menangkap pembolehubah temp bebas, dengan itu mengelakkan masalah nilai pembolehubah ditimpa, dan output akhir akan memaparkan 0 hingga 9 dengan betul.

Atas ialah kandungan terperinci Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan