Does array's each-block destroies outer objects ?

W

w wg

Hi,

Please look:
x = 2840 => 2840
x.object_id
=> 5681
a = [1,2,3,4,5] => [1, 2, 3, 4, 5]
a[4].object_id
=> 11

a.each {|x| puts x}
1
2
3
4
5
=> [1, 2, 3, 4, 5]
a[4].object_id
=> 11
x.object_id
=> 11

After execute the block , it looks like that ruby destroied the former
'x' object, the 'x' object has object_id 4 now, which is same as
a[4].object_id.

If so , does it mean that I must choose another variable name in
array's each block to keep the 'x' object alive ?

Thank you.
 
S

Sebastian Hungerecker

w said:
After execute the block , it looks like that ruby destroied the former
'x' object, the 'x' object has object_id 4 now, which is same as
a[4].object_id.

Yes, if you do {|foo|...} and you have a local variable foo outside the block,
then the outer foo will be replaced by the value that is yielded to the block.
This is a property of blocks in 1.8, not of each in particular. This behaviour
will no longer be present in 1.9.
If so , does it mean that I must choose another variable name in
array's each block to keep the 'x' object alive ?

Yes.

HTH,
Sebastian
 
R

Robert Klemme

There is no object destroyed. The variable x is made to point to
another object. If there are no more references to the object pointed
to by x before it can be garbage collected at any point in time after x
has been made to point to another instance.
the 'x' object has object_id 4 now, which is same as
a[4].object_id.

Yes, if you do {|foo|...} and you have a local variable foo outside the block,
then the outer foo will be replaced by the value that is yielded to the block.
This is a property of blocks in 1.8, not of each in particular. This behaviour
will no longer be present in 1.9.
If so , does it mean that I must choose another variable name in
array's each block to keep the 'x' object alive ?

Yes.

Just to throw in the keyword for the concept involved to help in further
research of the matter: the concept is called "scoping" - the scoping
rules for a programming language determine which variables are visible
in which program artifacts (blocks, methods...) and especially what
happens to variables with identical names.

Kind regards

robert
 

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,772
Messages
2,569,593
Members
45,104
Latest member
LesliVqm09
Top