Project

General

Profile

Actions

Bug #19910

open

Set#delete_if behavior inconsistent with Array/Hash

Added by segiddins (Samuel Giddins) about 1 year ago. Updated about 1 year ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:114943]

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

Actions

Also available in: Atom PDF

Like0
Like0Like0