
-----------------------------------
wtd
Fri Oct 28, 2005 5:35 pm

Scoping, Conditionals and Loops
-----------------------------------
Coming from something like C, C++, Java, C# or one of the other similar languages, Ruby's scoping rules may seem a bit odd.

Things like loops and conditionals don't introduce a new scope.

We might seem something like this in C:

void foo()
{
   int bar;

   if (some_condition)
   {
      bar = 27;
   }
   else
   {
      bar = 42;
   }

   printf("%d\n", bar);
}

Rather than:

void foo()
{
   if (some_condition)
   {
      int bar = 27;
   }
   else
   {
      int bar = 42;
   }

   printf("%d\n", bar);
}

Because in the latter bit of code, "bar" is local to each block.  Once that conditional goes out of scope, those declarations go away.  Thus the "printf" call fails.

def foo
   if some_condition
      bar = 27
   else
      bar = 42
   end

   puts bar
end

Since there is no new scope introduced, bar sticks around.

This could be seen as good or bad, but at least it is the way things are, and understanding it is important for any Ruby programmer.
