When should one use "and" and "or"

Hi All,

just got hit w the ff

case
when x==1 or x==2
  print "yeoh!"
end

SyntaxError: compile error
(irb):17: syntax error, unexpected kOR, expecting kTHEN or ':' or '\n' or ';'
when x==1 or x==2
            ^

"or" and "and" both exhibit the behaviour in ruby1.8/1.9.

workaround
1 put parens around the condition (not again)
2 replace or/and with ||/&&

i believe there are other similar quirks when using "and/or"..
has ruby relegated the use of "and/or"....?

best regards -botp

x = 5
    ==>5
case x
  when 2,3
    p 'no'
  when 4,5
    p 'yes'
end
"yes"
    ==>nil

···

On Feb 4, 9:55 pm, botp <botp...@gmail.com> wrote:

Hi All,

just got hit w the ff

> case
> when x==1 or x==2
> print "yeoh!"
> end

botp wrote:

i believe there are other similar quirks when using "and/or"..
has ruby relegated the use of "and/or"....?

No, but it's essentially inherited from perl. These operators have
extremely low precedence, so without parens your statement was being
parsed as something like

  (when x==1) or x==2

I think the typical perl use is something like:

  open F, "foo" or die "Oops";

If you use || then you need extra params so you don't get
open(F, "foo" || die "Oops");

But if you rely on poetry mode like this it may still trip you up. IMO
you're better off with:

  a = (some-expr) || (raise "Oops")
  a = (some-expr) || raise("Oops")

···

--
Posted via http://www.ruby-forum.com/\.

#> x = 5
#> ==>5
#> case x
#> when 2,3
#> p 'no'
#> when 4,5
#> p 'yes'
#> end

of course i know that :wink:
im talking about the second type of "case", eg

case
when x.baz and y.foo

....

best regards -botp

···

On Fri, Feb 5, 2010 at 1:45 PM, w_a_x_man <w_a_x_man@yahoo.com> wrote:

....

but brian, i'm still inside the "case" block. can't ruby sense that?

best regards -botp

···

On Fri, Feb 5, 2010 at 3:14 PM, Brian Candler <b.candler@pobox.com> wrote:

No, but it's essentially inherited from perl. These operators have
extremely low precedence, so without parens your statement was being
parsed as something like

(when x==1) or x==2

I think the typical perl use is something like:

botp wrote:

�(when x==1) or x==2

I think the typical perl use is something like:

....

but brian, i'm still inside the "case" block. can't ruby sense that?

I agree, but in the absence of a formal grammar you'll have to look at
the implementation.

···

--
Posted via http://www.ruby-forum.com/\.

botp wrote:

No, but it's essentially inherited from perl. These operators have
extremely low precedence, so without parens your statement was being
parsed as something like

(when x==1) or x==2

I think the typical perl use is something like:

....

but brian, i'm still inside the "case" block. can't ruby sense that?

And shouldn't 'when' have the same precedence as 'if'?

At least for 'or', you can use a comma instead:

case
when x==1, x==2; puts "1 or 2"
end

but it doesn't read as well, and there's nothing that works like this for 'and'.

···

On Fri, Feb 5, 2010 at 3:14 PM, Brian Candler <b.candler@pobox.com> wrote: