--00163630f5f32c65a0049a6a175c Content-Type: text/plain; charset=ISO-8859-1 On Sat, Jan 22, 2011 at 12:20 AM, Tim Morgan <tim / timmorgan.org> wrote: > Forgive this very basic question, but Googling has not answered my > question, and I'm sure it's a simple one for the gurus here. > > I've been using Ruby for years, and I've always had questions about > how it handles scope. Usually Ruby just does what I would expect it > to. > > In reading about lexical vs. dynamic scope on various places on the > Web, I read that Ruby has lexical (static) scope. But I cannot prove > it to myself with code. For example, the following produces one (1) -- > not zero (0) as I would expect it to if Ruby was truly statically > scoped: > > x > f roc.new { x } > g roc.new { > x > f.call > } > puts g.call > # 1 > > (I purposely used Procs instead of regular methods here since Ruby > methods cannot see the top-level "x" variable at all, which is a whole > other issue.) > > Is Ruby really dynamically scoped? > > The x in g is the same as the x outside of g. There is only one single x in your program, so this doesn't show much. Maybe this instead? def show_error(f) f.call rescue e e end f ambda { x } show_error f # #<NameError: undefined local variable or method `x' for main:Object> x show_error f # #<NameError: undefined local variable or method `x' for main:Object> g ambda { x } show_error g # 1 --00163630f5f32c65a0049a6a175c--