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
Linda Hamiltonasal
2025-01-14 11:26:46727semak imbas

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>

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>

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!

Kenyataan:
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