Ara.T.Howard wrote:
> 3)
> 
>   tuples = db.execute sql
> 
>   tuple = tuples.first
>   answer = tuple.first
> 
>   raise "something terrible has happened in the database" unless
>     answer == 42

Actually, (3) is even worse that it looks here, because you have to test 
tuple before sending #first to it, if you want the same semantics as (1) 
and (2).

(3b)
    tuples = db.execute sql

    tuple = tuples.first
    raise "something terrible has happened in the database" unless tuple

    answer = tuple.first
    raise "something terrible has happened in the database" unless
      answer == 42

I guess you could put a "rescue NoMethodError" clause around everything, 
but that would hide any NoMethodError that came up in, say, #first. So 
the argument for (1) is pretty strong...

OTOH, (3b) has the advantage that you can make the error message more 
informative in each of the two error cases.

If someone wants a conditional with a short-circuitable sequence of 
tests, but without the compact elegance of (1), they could do something 
like this:

     def the_following_checks_succeed
       catch :fail do yield end
     end

     def check
       yield or throw :fail, false
     end

     tuples = [ [42,2,3], [4,5,6] ]
     raise "something's wrong" unless the_following_checks_succeed do
       check {tuples}
       tuple = check {tuples[0]}
       answer = check {tuple[0]}
       answer == 42    # or: check {answer == 42}
     end
     puts "Now, what is the question?"