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
Updated by stevegeek (Stephen Ierodiaconou) about 1 year ago
I was just looking at this, and it seems like the behaviour used to be as you expected but changed in v2.1, https://github.com/ruby/ruby/commit/2849ee5d18360f26b55643a2643a1c597376865d
Updated by the_spectator (Akshay Birajdar) about 1 year ago
Took a stab at it in https://github.com/ruby/ruby/pull/8642
Actions
Like0
Like0Like0