Rumah > pembangunan bahagian belakang > C++ > Mengapa Ungkapan Lambda dalam Gelung Menghasilkan Keputusan yang Tidak Dijangka?

Mengapa Ungkapan Lambda dalam Gelung Menghasilkan Keputusan yang Tidak Dijangka?

Linda Hamilton
Lepaskan: 2025-01-14 11:26:46
asal
721 orang telah melayarinya

Why Do Lambda Expressions in Loops Produce Unexpected Results?

Ungkapan Lambda dan Pembolehubah Lelaran Gelung: Kemungkinan Perangkap

Menggunakan pembolehubah lelaran gelung secara langsung dalam ungkapan lambda biasanya tidak digalakkan. Amalan ini boleh menghasilkan hasil yang tidak dijangka disebabkan oleh cara ekspresi lambda mengendalikan tangkapan berubah-ubah.

Ekspresi Lambda menangkap rujukan kepada pembolehubah, bukan nilainya pada masa tangkapan. Oleh itu, apabila gelung berulang, ungkapan lambda yang dibuat dalam gelung semuanya merujuk pembolehubah lelaran yang sama dan sentiasa berubah. Ini membawa kepada semua lambda akhirnya menggunakan nilai akhir pembolehubah selepas gelung selesai, bukan nilainya pada masa setiap lambda dicipta.

Mari kita menggambarkan ini dengan contoh VB.NET:

<code class="language-vb.net">Dim actions = new List(Of Action)()

For i As Integer = 0 To 9
    actions.Add(New Action(Function() Console.WriteLine(i)))
Next

For Each action As Action In actions
    action()
End For</code>
Salin selepas log masuk

Anda mungkin menjangkakan ini akan mencetak 0 hingga 9. Sebaliknya, ia mencetak 10 sepuluh kali! Ini kerana setiap Action dalam senarai actions merujuk i yang sama, dan pada masa gelung kedua dilaksanakan, i telah pun mencapai nilai akhir 10.

Masalah bertambah kuat apabila badan gelung mempunyai kesan sampingan yang memberi kesan kepada pembolehubah yang dirujuk oleh ungkapan lambda. Ini boleh menyebabkan ketidakkonsistenan yang sukar untuk dinyahpepijat.

Penyelesaian: Buat Salinan Tempatan

Untuk mengelakkan ini, buat salinan tempatan pembolehubah lelaran di dalam gelung:

<code class="language-vb.net">Dim actions = new List(Of Action)()

For i As Integer = 0 To 9
    Dim localI As Integer = i ' Create a local copy
    actions.Add(New Action(Function() Console.WriteLine(localI)))
Next

For Each action As Action In actions
    action()
End For</code>
Salin selepas log masuk

Kini, setiap ungkapan lambda menangkap pembolehubah localI unik, mengekalkan nilainya pada masa penciptaan. Output dengan betul akan menjadi 0 hingga 9. Perubahan mudah ini memastikan setiap lambda beroperasi dengan nilai bebasnya sendiri, mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Mengapa Ungkapan Lambda dalam Gelung Menghasilkan Keputusan yang Tidak Dijangka?. 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