Actions
Bug #19910
openSet#delete_if behavior inconsistent with Array/Hash
Description
Given the following script:
#!/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}
#<Set: {0, 1, 2, 3, 4, 5, 6, 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
Actions
Like0
Like0Like0