Newbie, questions about === expression

Hi,

I'm learning ruby this days.
And I followed this docs: http://www.ruby-doc.org/docs/ProgrammingRuby/

Now, I have some questions about === expression

irb(main):138:0> case 1
irb(main):139:1> when 1..10 then 'in'
irb(main):140:1> else 'not in'
irb(main):141:1> end

obviously, the result is 'in'

In the docs, there are an explanation:
*case operates by comparing the target (the expression after the keyword
case) with each of the comparison expressions after the when keywords. This
test is done using comparison === target. As long as a class defines
meaningful semantics for === (and all the built-in classes do), objects of
that class can be used in case expressions. *

But, when I type this, why throw an error ?

irb(main):149:0> 1..10 === 1
ArgumentError: bad value for range
    from (irb):149
    from /opt/ruby-1.9.3/bin/irb:12:in `<main>'

Thanks.

Oh, Maybe I found the reason:

irb(main):195:0> (1..10) === 1
=> true

···

2012/10/27 月忧茗 <yueyoum@gmail.com>

Hi,

I'm learning ruby this days.
And I followed this docs: Programming Ruby: The Pragmatic Programmer's Guide

Now, I have some questions about === expression

irb(main):138:0> case 1
irb(main):139:1> when 1..10 then 'in'
irb(main):140:1> else 'not in'
irb(main):141:1> end

obviously, the result is 'in'

In the docs, there are an explanation:
*case operates by comparing the target (the expression after the keyword
case) with each of the comparison expressions after the when keywords.
This test is done using comparison === target. As long as a class defines
meaningful semantics for === (and all the built-in classes do), objects
of that class can be used in case expressions. *

But, when I type this, why throw an error ?

irb(main):149:0> 1..10 === 1
ArgumentError: bad value for range
    from (irb):149
    from /opt/ruby-1.9.3/bin/irb:12:in `<main>'

Thanks.

You need to put parentheses around the range:

(1..10) === 1

otherwise ruby understands the expression as if it were
1..(10 === 1)

that is, as

10..false,

which, of course, is not a valid range.

I hope this helps

Stefano

···

On Saturday 27 October 2012 月忧茗 wrote

Hi,

I'm learning ruby this days.
And I followed this docs: Programming Ruby: The Pragmatic Programmer's Guide

Now, I have some questions about === expression

irb(main):138:0> case 1
irb(main):139:1> when 1..10 then 'in'
irb(main):140:1> else 'not in'
irb(main):141:1> end

obviously, the result is 'in'

In the docs, there are an explanation:
*case operates by comparing the target (the expression after the keyword
case) with each of the comparison expressions after the when keywords. This
test is done using comparison === target. As long as a class defines
meaningful semantics for === (and all the built-in classes do), objects of
that class can be used in case expressions. *

But, when I type this, why throw an error ?

irb(main):149:0> 1..10 === 1
ArgumentError: bad value for range
    from (irb):149
    from /opt/ruby-1.9.3/bin/irb:12:in `<main>'

Thanks.