Why cannot i put conditions in when clause

irb(main):003:0> case a
irb(main):004:1> when 0
irb(main):005:1> puts "0"
irb(main):006:1> when >0
irb(main):007:1> puts "greater"
irb(main):008:1> end
SyntaxError: compile error
(irb):6: syntax error, unexpected '>'
when >0
      ^
        from (irb):8

Junkone wrote:

irb(main):003:0> case a
irb(main):004:1> when 0
irb(main):005:1> puts "0"
irb(main):006:1> when >0
irb(main):007:1> puts "greater"
irb(main):008:1> end
SyntaxError: compile error
(irb):6: syntax error, unexpected '>'
when >0
      ^
        from (irb):8

That's what if..else..end is there for.

In a case statement you usually check against 'known' and well-defined
states. Also, once a condition is met in a case statement, no other
branches are evaluated. So, if you had 'when < 1' that wouldn't be
evaluated, even id a = 2.

- --
Phillip Gawlowski
Twitter: twitter.com/cynicalryan
Blog: http://justarubyist.blogspot.com

10 years old is a good age to get stuck at.

Junkone wrote:

irb(main):003:0> case a
irb(main):004:1> when 0
irb(main):005:1> puts "0"
irb(main):006:1> when >0
irb(main):007:1> puts "greater"
irb(main):008:1> end
SyntaxError: compile error
(irb):6: syntax error, unexpected '>'
when >0
      ^
        from (irb):8

It's not an expression.

You can do this:

case
when a==0
when a>0
end

or

case a
when 0
when 0..MAX_EXPECTED_VALUE_FOR_A
end

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Idea #1:

   when 0..(1.0/0.0)

Idea #2:

   case # note that I have removed the a
   # ...
   when a > 0

Hope that helps.

James Edward Gray II

···

On Jun 5, 2008, at 12:29 PM, Junkone wrote:

irb(main):006:1> when >0

irb(main):003:0> case a
irb(main):004:1> when 0
irb(main):005:1> puts "0"
irb(main):006:1> when >0
irb(main):007:1> puts "greater"
irb(main):008:1> end
SyntaxError: compile error
(irb):6: syntax error, unexpected '>'
when >0
      ^
        from (irb):8

You can:

$ ruby -ce 'case;when a == 0;puts "0";when a > 0;puts "greater";end'
Syntax OK

This is the second form of "case".

Btw, there is also another way: define a criteria that implements === as >0:

irb(main):001:0> POS = Object.new
=> #<Object:0x7ff9e244>
irb(main):002:0> def POS.===(x) x > 0 end
=> nil
irb(main):003:0> a=10
=> 10
irb(main):004:0> case a
irb(main):005:1> when 0
irb(main):006:1> puts "0"
irb(main):007:1> when POS
irb(main):008:1> puts "positive"
irb(main):009:1> end
positive
=> nil
irb(main):010:0>

Kind regards

  robert

···

On 05.06.2008 19:26, Junkone wrote:

:wink:

···

James Gray <james@grayproductions.net> wrote:

Idea #1:

   when 0..(1.0/0.0)

--
Une Bévue

First of all: huh. Learn something new about Ruby (almost) every day.

That said - why would you do this rather than an if/elsif? I'm
genuinely curious. E.g.

  if a == 0 then ...
  elsif a>0 then ...
  end

···

On Thu, Jun 5, 2008 at 1:40 PM, Joel VanderWerf <vjoel@path.berkeley.edu> wrote:

You can do this:

case
when a==0
when a>0
end

--
Avdi

Home: http://avdi.org
Developer Blog: Avdi Grimm, Code Cleric
Twitter: http://twitter.com/avdi
Journal: http://avdi.livejournal.com