Why does this parse?

Just ran down an interesting 'bug' in my code, but I'm confused as to
why it parses at all. Can someone explain to me what the parser is
doing in this case? (Please cc: me directly also please; I don't
want to miss the answer.)

if (x != y ||
    x != z
    y != z)
  puts "foo"
end

(notice the missing "||" after the second comparison)

if (x != y ||
    x != z
    y != z)
  puts "foo"
end

ruby see it as a block, the last expression will give it the value for the
test

uln% ruby -e 'if (1 != 1 || 1 != 1; 1); puts "ok"; end'
ok
uln%

uln% ruby -e 'if (1 != 1 || 1 != 1; nil); puts "ok"; end'
uln%

Guy Decoux

Michael Campbell wrote:

Just ran down an interesting 'bug' in my code, but I'm confused as to
why it parses at all. Can someone explain to me what the parser is
doing in this case? (Please cc: me directly also please; I don't
want to miss the answer.)

if (x != y ||
    x != z
    y != z)
  puts "foo"
end

My guess: it is parsing it as two expressions, like so:

if ( x != y || x != z; y != z )
     <--- first -----> <-- 2nd -->

Ruby is very expressio-oriented.

(notice the missing "||" after the second comparison)

HTH,
-- shanko