From: "Eregon (Benoit Daloze) via ruby-core" Date: 2026-05-05T20:03:06+00:00 Subject: [ruby-core:125415] [Ruby Bug#22021] Array#delete_if may delete wrong object if array has been altered already Issue #22021 has been updated by Eregon (Benoit Daloze). The only way to iterate an Array is to use an index from 0 to size, so it's always going to be based on index. chucke (Tiago Cardoso) wrote in #note-4: > I don't see why the element ref can't be kept for post-comparison What if you have `[1, 2, 2, 2, 2, 3, 4, 5, 2]`, how would `delete_if` find out if one of the `2` was removed concurrently? There could also be another Thread writing to the Array, so checking if the element is the same before yielding to the block and after is inherently brittle and unreliable. ---------------------------------------- Bug #22021: Array#delete_if may delete wrong object if array has been altered already https://bugs.ruby-lang.org/issues/22021#change-117212 * Author: chucke (Tiago Cardoso) * Status: Rejected * ruby -v: 4.0.2 * Backport: 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN ---------------------------------------- The simplest example I can come up with: ```ruby $ar = ar = [1, 2, 3, 4, 5] def del(i) $ar.delete(i) end ar.delete_if { |e| e == 2 ? (del(e) && true) : false } p ar #=> [1, 4, 5], and it should be [1, 3, 4, 5] ``` -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/