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/