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

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

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 G.
Twitter: twitter.com/cynicalryan
Blog: http://justarubyist.blogspot.com

10 years old is a good age to get stuck at.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkhIJQMACgkQbtAgaoJTgL/PdACgl0ZgF5lF/X8wKPql1h/+Y+/s
BbcAn3KLQdeiCg2iYEsx2jr1MzKsBLPY
=L4oU
-----END PGP SIGNATURE-----

Junkone wrote:

    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

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

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

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 G. II

On 05.06.2008 19:26, Junkone wrote:

    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

James G. [email protected] wrote:

Idea #1:

when 0…(1.0/0.0)

:wink:

On Thu, Jun 5, 2008 at 1:40 PM, Joel VanderWerf
[email protected] wrote:

You can do this:

case
when a==0
when a>0
end

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


Avdi

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