From: "wanabe (_ wanabe) via ruby-core" Date: 2026-08-16T04:33:02+00:00 Subject: [ruby-core:126399] [Ruby Bug#19910] Set#delete_if behavior inconsistent with Array/Hash Issue #19910 has been updated by wanabe (_ wanabe). Status changed from Open to Closed This behavior was fixed by e4f85bfc311a3812de7bc2e9d068934e8b364574 == https://bugs.ruby-lang.org/issues/21216. ``` $ git checkout e4f85bfc311a3812de7bc2e9d068934e8b364574~ && make -j miniruby > /de v/null && ./miniruby -I$(git rev-parse --show-toplevel)/lib a.rb Previous HEAD position was e4f85bfc311 Implement Set as a core class HEAD is now at b1283b45e62 maybe fix bindgen [1, 3, 5, 6, 7] {1 => 1, 3 => 3, 5 => 5, 6 => 6, 7 => 7} # $ git checkout e4f85bfc311a3812de7bc2e9d068934e8b364574 && make -j miniruby > /dev /null && ./miniruby -I$(git rev-parse --show-toplevel)/lib a.rb Previous HEAD position was b1283b45e62 maybe fix bindgen HEAD is now at e4f85bfc311 Implement Set as a core class [1, 3, 5, 6, 7] {1 => 1, 3 => 3, 5 => 5, 6 => 6, 7 => 7} # ``` ---------------------------------------- Bug #19910: Set#delete_if behavior inconsistent with Array/Hash https://bugs.ruby-lang.org/issues/19910#change-118537 * Author: segiddins (Samuel Giddins) * Status: Closed * ruby -v: 3.2.2 * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Given the following script: ```ruby #!/usr/bin/env ruby require 'set' def enum(collection) i = 0 collection.delete_if do i += 1 raise ArgumentError if i == 6 i.odd? end rescue ArgumentError return collection end pp enum([0, 1, 2, 3, 4, 5, 6, 7]) pp enum([0, 1, 2, 3, 4, 5, 6, 7].to_h { [_1, _1] }) pp enum([0, 1, 2, 3, 4, 5, 6, 7].to_set) ``` It results in: ``` [1, 3, 5, 6, 7] {1=>1, 3=>3, 5=>5, 6=>6, 7=>7} # ``` As you can see, when an exception is raise inside `delete_if` on Hash/Array, the already-considered elements are still removed from the array. For `Set`, no elements are deleted (due to the implementation that builds up an intermediary list of elements to delete, then removes them from the underlying hash afterwards). It would be very helpful if `Set#delete_if` behaved consistently with other core collection types -- 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/