tags:

views:

511

answers:

4

Does Ruby have a plain-English keyword for exclusive or, like they have "and" and "or"? If not, is this because exclusive or doesn't allow evaluation short-cutting?

+5  A: 

No it doesn't, you can only use ^.

Don't know why there isn't particularly, may just be because it isn't as commonly used.

Garry Shutler
+3  A: 

Try ^

true  ^ false #=> true
true  ^ true  #=> false
false ^ false #=> false

No plain english equivalent operator though.

Squeegy
+4  A: 

Firstly, I don't think shortcircuiting can sensibly apply to XOR: whatever the value of the first operand, the second needs to be examined.

Secondly, and, &&, or and || use shortcircuiting in all cases; the only difference between the "word" and "symbol" versions is precedence. I believe that and and or are present to provide the same function as perl has in lines like

process_without_error or die

I think the reason for not having a xor named function is probably that there's no point in a low-precedence operator in this case and that it's already a confusing enough situation!

Mike Woodhouse
A: 

I ran into an issue because the '^' operator acts bitwise on numbers,

true ^ 1
=> false

1 ^ true
TypeError: can't convert true into Integer
true ^ 1

so my workaround was:

( !!a ^ !!b ) where the double-bang coerces them into booleans.

!!1 ^ !!true
=> false

!!1 ^ !!false
=> true
Matt Van Horn
Interesting, but not hugely relevant to the question.
Macha