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!