Lambda 表達式與循環迭代變數:一個潛在的陷阱
通常不鼓勵在 lambda 表達式中直接使用循環迭代變數。 由於 lambda 表達式處理變數捕獲的方式,這種做法可能會產生意想不到的結果。
Lambda 表達式擷取對變數的引用,而不是捕獲時的值。 因此,當循環迭代時,循環內建立的 lambda 表達式都會引用相同的、不斷變化的迭代變數。 這導致所有 lambda 在循環完成後最終使用變數的 final 值,而不是建立每個 lambda 時的值。
讓我們用 VB.NET 範例來說明這一點:
1 2 3 4 5 6 7 8 9 |
|
您可能會期望它會列印 0 到 9。相反,它打印 10 十次!這是因為 Action
列表中的每個 actions
都引用相同的 i
,並且當第二個循環執行時,i
已經達到其最終值 10。
當循環體具有影響 lambda 表達式引用的變數的副作用時,問題就會放大。 這可能會導致難以調試的不一致。
解決方案:建立本機副本
為了防止這種情況發生,請在循環內建立迭代變數的本機副本:
1 2 3 4 5 6 7 8 9 10 |
|
現在,每個 lambda 表達式都會捕獲一個唯一的 localI
變量,並在創建時保存其值。 輸出將正確地為 0 到 9。這個簡單的變更可確保每個 lambda 使用自己獨立的值進行操作,避免意外行為。
以上是為什麼循環中的 Lambda 表達式會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!