Hi --

On Sun, 9 Jul 2006, Dark Ambient wrote:

> On 7/9/06, dblack / wobblini.net <dblack / wobblini.net> wrote:
>
>> 
>> There's no issue of nil being smaller or larger than anything.  The
>> first time through your loop, lowest is nil -- which means that the
>> item < lowest comparison is never evaluated.
>
>
> Okay, I sort of see that.
>
> The next time through,
>> lowest is "five", so item < lowest is evaluated.  It's false, so the
>> next statement (lowest = item) is not executed.
>
>
> Don't get this looking at the 'if' statement
>
> if lowest == nil || item < lowest
> lowest = item
>
> First confusion is || , this I take to be 'or' ?
> Second, if the assignment of 'lowest = item' comes after the 'if'
> conditional, how does any 'tem become the lowest. The way I'm reading the
> statement (using the array -  mylist = ['five', 'eight', 'one', 'ten',
> 'nine']) I interpret the second iteration as
> if lowest == nil or 'five' < lowest        # lowest is still equal to nil ?
> Or could it be that in the 'if' block, the 'lowest = item' is set before the
> 'if conditons'  are checked ?

No, definitely not.  It's all very linear:

   if <some expression is true>
     do this
   end

If the expression isn't true, then "do this" never gets executed.

You might put some extra output in your loop, so you can see what's
going on:


def sort(list)
    sorted = []
    unsorted = []

   lowest = nil

   list.each do |item|
     puts "Comparing #{item.inspect} (item) to #{lowest.inspect} (lowest)"
     if lowest == nil || item < lowest
       puts "Either lowest is nil, or #{item.inspect} is less than #{lowest.inspect}"
       puts "So lowest is now being set to #{item.inspect}"
       lowest = item
     end
   end

   puts "Loop finished: lowest is #{lowest.inspect}"
   sorted.push(lowest)
   puts sorted

end
mylist = ['five', 'three', 'one', 'ten', 'eight']
sort mylist

The output is:

Comparing "five" (item) to nil (lowest)
Either lowest is nil, or "five" is less than nil
So lowest is now being set to "five"
Comparing "three" (item) to "five" (lowest)
Comparing "one" (item) to "five" (lowest)
Comparing "ten" (item) to "five" (lowest)
Comparing "eight" (item) to "five" (lowest)
Either lowest is nil, or "eight" is less than "five"
So lowest is now being set to "eight"
Loop finished: lowest is "eight"


David

-- 
http://www.rubypowerandlight.com => Ruby/Rails training & consultancy
http://www.manning.com/black     => RUBY FOR RAILS, the Ruby book for
                                                     Rails developers
http://dablog.rubypal.com        => D[avid ]A[. ]B[lack's][ Web]log
dblack / wobblini.net              => me