Feature #13801
closedImplement case equality test for Set#===
Description
In keeping with other class semantics, Set should implement an inclusion / membership test for #===.
For example with Range:
(1..3) === 2 #=> true
Desired behavior:
Set[1, 2, 3] === 2 #=> true
Current behavior:
Set[1, 2, 3] === 2 #=> false
Updated by davidarnold (David Arnold) over 7 years ago
Created pull request: https://github.com/ruby/ruby/pull/1673
Updated by knu (Akinori MUSHA) over 7 years ago
- Assignee set to knu (Akinori MUSHA)
Updated by kernigh (George Koehler) about 7 years ago
Here's a counterexample with Array:
[1, 2, 3] === 2 #=> false
Array#=== doesn't look inside the array. I expect Set to act almost like Array, so it would be weird if Set#=== looked inside the container but Array#=== didn't.
Updated by davidarnold (David Arnold) about 7 years ago
I expect Set to act almost like Array [...]
But why? Aside from both being collections, there is no connection. Ruby's Set isn't even implemented with an Array.
The core mathematical definition of Set is based on element membership[1]. All of the characteristic operations on sets (intersection, union, difference, etc) are derived based on element membership. When #=== has the common semantics in Ruby of membership, why should the one class, which is probably most closely tied to the notion of membership, not implement this operator?
FWIW, I would not be opposed to Array implementing #=== as a membership test either, but this is not a feature request for Array.
- "Set theory begins with a fundamental binary relation between an object o and a set A. If o is a member (or element) of A, the notation o ∈ A is used." https://en.wikipedia.org/wiki/Set_theory
Updated by knu (Akinori MUSHA) about 7 years ago
- Status changed from Open to Closed
Updated by knu (Akinori MUSHA) about 7 years ago
I don't remember but I guess I didn't define Set#===
probably because Array didn't, but I agree Set#===
could be useful and intuitive, so I've merged your PR with a slight modification (alias to save an extra method call) and a test in addition to the specs. Thanks!