CARVIEW |
Select Language
HTTP/2 200
x-amz-id-2: VoNagCp1CZesUfCdyG+1OS1ee2dA/n/aDgRDH/6/GCA6RjmuoLDHSIGtNFVlFWlVYF9OyHr3lkjZLwsufZGR+UqCPKOG0lsbyNkQTOY/gks=
x-amz-request-id: 80GXFFCYVCHWK6TZ
last-modified: Tue, 27 May 2025 06:51:22 GMT
etag: "36cfa31ac1e4202297fdd37b74334a7b"
x-amz-server-side-encryption: AES256
server: AmazonS3
content-encoding: gzip
via: 1.1 varnish, 1.1 varnish
content-type: text/plain; charset=utf-8
accept-ranges: bytes
age: 0
date: Fri, 25 Jul 2025 18:35:07 GMT
x-served-by: cache-tyo11943-TYO, cache-bom-vanm7210087-BOM
x-cache: MISS, MISS
x-cache-hits: 0, 0
x-timer: S1753468507.729463,VS0,VE382
vary: Accept-Encoding
content-length: 1082
From: "Ethan (Ethan -) via ruby-core"
Date: 2025-05-27T06:47:45+00:00
Subject: [ruby-core:122305] [Ruby Bug#21376] Inconsistent equality between Sets with different compare_by_identity, different classes
Issue #21376 has been reported by Ethan (Ethan -).
----------------------------------------
Bug #21376: Inconsistent equality between Sets with different compare_by_identity, different classes
https://bugs.ruby-lang.org/issues/21376
* Author: Ethan (Ethan -)
* Status: Open
* ruby -v: ruby 3.5.0dev (2025-05-26T17:42:35Z master 909a0daab6) +PRISM [x86_64-darwin22]
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
This is an inconsistency between the new core Set and the ruby-implemented Set. I think probably the new implementation's behavior seems correct and the ruby implementation is an incorrect edge case.
```ruby
class MySet < Set
end
o = Object.new
Set.new([o]).compare_by_identity == MySet.new([o])
# => false on 3.5.0; true with the ruby implementation
```
My understanding is that, for Hash, if two hashes have unequal `compare_by_identity?` they are never equal (even if containing identical contents), unless both are empty. It would make sense for Set to be the same.
Hmm, analyzing the ruby Set#== a bit more, I see a further edge case where a non-identity set is considered equal to an identity set with as few as one element in common.
```ruby
set_by_eq = Set.new(['a', 'b', 'c'])
# => #
set_by_id = MySet.new.compare_by_identity.merge(['a', 'a'.dup, 'a'.dup])
# => #
set_by_eq == set_by_id
# => true in the ruby set, false in core set
set_by_id == set_by_eq
# => false in both
```
The latter seems unlikely it would ever be triggered unintentionally. The former I did happen across, but since I think the new behavior is correct, I will not be affected when I fix my code to consistently compare_by_identity. Given that, it may be questionable whether it's worth fixing.
--
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/