Does array's each-block destroies outer objects?

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.

···

--
Wwg

w wg wrote:

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

···

--
NP: Die Apokalyptischen Reiter - Ein Lichtlein
Jabber: sepp2k@jabber.org
ICQ: 205544826

w wg wrote:

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.

Hello. Have a look at this topic: That was unexpected -- strange scoping behavior - Ruby - Ruby-Forum
about the same problem.

TPR.

···

--
Posted via http://www.ruby-forum.com/\.

w wg wrote:

After execute the block , it looks like that ruby destroied the former
'x' object,

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

···

On 27.09.2008 11:14, Sebastian Hungerecker wrote: