Robert Klemme
6/4/2007 4:16:00 PM
On 04.06.2007 17:56, Yossef Mendelssohn wrote:
> Something came up as I was testing some ideas. I know Range objects
> can indicate whether a specific object is an included element, but
> something I thought might work didn't:
>
> irb(main):001:0> (1..10).include?(2..6)
> => false
>
> I know a simple case like this can be covered with (1..10).include? 2
> and (1..10).include? 6 (range1 includes both range2.first and
> range2.last), but doing it that way seems not entirely right,
> especially when it comes to other cases. A big problem, as I see it,
> would be trying to figure out what to do if the second range excludes
> its end.
>
>
> Maybe I'm just thinking about this completely wrong. Maybe I should
> be using Sets or something. Knowing about intersects would be nice,
> too.
>
> Any thoughts?
Similar discussions have come up here before. The net was, that because
of all sorts of issues (which you partly identified yourself already) it
would not be wise to extend functionality of Range#include? beyond the
current behavior. You'll sure find more detail in the archives but one
reason for example is that other Enumerable's include? methods always
check for single element membership only. For all the other operations
there is - and & etc.
18:13:10 [contentreporter]: irb -r set
irb(main):001:0> s1=(1..10).to_set
=> #<Set: {5, 6, 1, 7, 2, 8, 3, 9, 4, 10}>
irb(main):002:0> s2=(1...10).to_set
=> #<Set: {5, 6, 1, 7, 2, 8, 3, 9, 4}>
irb(main):003:0> s1 == s2
=> false
irb(main):004:0> s1 - s2
=> #<Set: {10}>
irb(main):005:0> s2 - s1
=> #<Set: {}>
irb(main):010:0> s2.superset? s1
=> false
irb(main):011:0> s1.superset? s2
=> true
Kind regards
robert