[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Does array's each-block destroies outer objects ?

w wg

9/27/2008 9:08:00 AM

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

3 Answers

Sebastian Hungerecker

9/27/2008 9:14:00 AM

0

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

TPReal

9/27/2008 10:01:00 AM

0

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: http://www.ruby-...to...
about the same problem.

TPR.
--
Posted via http://www.ruby-....

Robert Klemme

9/27/2008 2:12:00 PM

0

On 27.09.2008 11:14, Sebastian Hungerecker wrote:
> 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