Block binding does not contains local variable

A

Artem Voroztsov

Maybe it contains.
But please, explain me why "block binding" does not print a, b, and c
variables.

def vars(&block)
b = block.call(55)
puts "inner binding: ", eval("local_variables", b)
puts "block binding: ", eval("local_variables", block.binding)
end

vars {|a|
b = 1
c = 2
binding
}

My output:

ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
inner binding:
c
b
a
block binding:
 
D

David A. Black

Hi --

Maybe it contains.
But please, explain me why "block binding" does not print a, b, and c
variables.

def vars(&block)
b = block.call(55)
puts "inner binding: ", eval("local_variables", b)
puts "block binding: ", eval("local_variables", block.binding)
end

vars {|a|
b = 1
c = 2
binding
}

My output:

ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
inner binding:
c
b
a
block binding:

My understanding is that given a Proc, there's no way that Ruby can
know what local variables are created inside it without running it, so
binding of the Proc itself is the binding of the local context where
it's created. It's only when the block is run that the local variables
inside the block get bound to anything, so binding inside the block is
a different binding and includes those variables.

You can see this if you do:

x = 1

and then call vars. block.binding will then include x.


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top