James,

> I'm aware this is a common approach, but I'm
> personally not found of it.
>
> First of all, it confuses readers of the code.  What
> size board are we really dealing with here?  Why do
> these loops keep starting at 1 instead of 0?

    Code like:

World = Array.new(rows + 2,Array.new(columns + 2))
(1..rows).each do |row|
  (1..columns).each do |column|

    ...would hardly be confusing to the readers of the code.

> Second, it almost always still requires special
> cases.  For example, in the mentioned Game of Life,
> we must be sure organisms are not born into these
> border rows, or they'll change the results.

    No special cases.  The loops from 1..rows and 1..columns prevent the
unused rows and columns from generating new cells.

> Finally, it's wasteful.  I realize the memory is
> insignificant here, but it might not be in a bigger
> application.

    I guess wasteful is in the eye of the beholder.  The code is faster
and infinitely more readable at the expense of a few hundred bytes of
memory - that's a trade-off I'll make any day.

> My opinion is that it's better to address the real
> issue than just hide it away.

    To me, the real issue is the special cases and how to avoid them.

    I'm not going to get into an argument on this, it's just my opinion.
Your opinions may vary :o)

    - Warren Brown