Skip to content

Ruby: Is &! documented anywhere?

5 pointschrislaco2 comments
On 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?

Comments

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

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 '&'.

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.