Implement case equality test for Set#===
In keeping with other class semantics, Set should implement an inclusion / membership test for #===.
For example with Range:
(1..3) === 2 #=> true
Set[1, 2, 3] === 2 #=> true
Set[1, 2, 3] === 2 #=> false
Updated by kernigh (George Koehler) over 4 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) over 4 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. 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) over 4 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!