Hello all,

I just compiled ruby 1.9.1 from source on my computer (osx snow
leopard), and I'm going through the old ruby quiz exercises for fun. I'm
on the secret santa one, and I wrote the code that determines that each
persons secret santa does not have the same last name, to ensure that
each person has to get a gift for someone from a different family. The
quiz is listed here:

http://rubyquiz.com/quiz2.html

My code runs fine most of the time. However, occasionally I'll get a
strange "undefined method" error. See the code below and sample output:

class Person
  attr_accessor :first, :last, :recipient
  def initialize(first, last)
    @first = first
    @last = last
    @recipient = nil
  end
end

a = [ giant listing of names in the format of "first last" ]

santa_array = [] # instantiate an empty array
a.each do |full_name|
  split_array = full_name.split
  my_person = Person.new(split_array[0], split_array[1])
  santa_array.push(my_person)
end

recipient_array = Array.new(santa_array)
santa_array.shuffle!
recipient_array.shuffle!

santa_array.each do |element|
  index = 0
  while element.recipient == nil
    if element.last != recipient_array[index].last # if the last names
are different, process
      element.recipient = recipient_array[index]
      recipient_array.delete_at(index)
    else
      index += 1 # else the last names are the same, loop again on index
+= 1
    end
  end
end

santa_array.each { |element| puts "#{element.first} #{element.last},
recipient == #{element.recipient.first} " +
                  "#{element.recipient.last}" }
puts "\n\n"
puts "santa_array.count == #{santa_array.count}"
puts "recipient_array.count == #{recipient_array.count}"

And here's some sample output:
brandentanga$ ./secretSanta.rb
./secretSanta.rb:67:in `block in <main>': undefined method `last' for
nil:NilClass (NoMethodError)
  from ./secretSanta.rb:64:in `each'
  from ./secretSanta.rb:64:in `<main>'
brandentanga$ ./secretSanta.rb
luke skywalker, recipient == lando calrissian
darth vader, recipient == han solo
anakin skywalker, recipient == jeanluc piccard
... so on and so forth, continuing to print properly...

As you can see from the above output, I ran my code twice, with no
modifications, all names are hard coded, and guaranteed to have first
and last names separated by a space. So how can the same code with the
same input produce a runtime error, then on the next run process as
expected?
-- 
Posted via http://www.ruby-forum.com/.