Ruby: Is &! documented anywhere?

5 points by chrislaco ↗ HN
A while back, due to a typo, I realized you could use &! in ruby statements:

  if this? &! that?
was the same as

  if this? && !that?
I've scoured all of the ruby operator docs I can find with no mention of it anywhere.

Interestingly, this works:

  if this? & ! that?
but this does not:

  if this? & & that?

If I ack the ruby source, I don't see &!, but I do see a ton of &&!

Wat? Now I'm curious. Anyone know the innards of ruby enough to enlighten me?

2 comments

[ 3.3 ms ] story [ 16.3 ms ] thread
Only when working with explicit Booleans, yes. Otherwise no:

    [21] pry(main)> foo = 1
    => 1
    [22] pry(main)> bar = false
    => false
    [23] pry(main)> foo && !bar
    => true
    [24] pry(main)> foo &! bar
    TypeError: can't convert true into Integer
    from (pry):24:in `&'
In this case, the behavior is inappropriate in that Ruby evaluates only false and nil for False, and everything else as True.

I'm going to assume this is some quirk or "feature" as part of the bitwise operator '&'.

It doesn't really work quite as you suggest; it's just that

    a &! b == a & !b
where !b is true if b is nil or false, and false otherwise.

& works as a bitwise AND for numbers, and a logical AND for boolean values. You can't mix the two, but as long as a is a boolean, you'll get some kind of result out of the calculation:

    true &! true  # => false
    true &! false # => true
    true &! 0     # => false
    0    &! 0     # => TypeError: can't convert false into Integer