[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

question regarding sub!

Martin Chandler

10/5/2008 10:16:00 AM

Hi,

Please excuse the newbie question, but I am confused by something I see with
sub!() (this seems to be true with other "!" operations as well):

irb(main):001:0> string1 = "hello"
=> "hello"
irb(main):002:0> string2 = string1
=> "hello"
irb(main):003:0> string2.sub!(/e/,"a")
=> "hallo"
irb(main):004:0> string2
=> "hallo"
irb(main):005:0> string1
=> "hallo"
irb(main):006:0>

Why is string1 also changed when sub!() is being performed on string2 ?
Shouldn't sub!() only be acting on the string it is being called on?

Thanks,
Martin

3 Answers

Lex Williams

10/5/2008 10:37:00 AM

0

when writing :

string2 = string1

both your variables reference the same address , so , modifications to
any of them will cause modification to the other .

If you write :

string2 = string1.clone

then you will modify just string2 , when writing sub!
--
Posted via http://www.ruby-....

Ruby Student

10/5/2008 11:26:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

On Sun, Oct 5, 2008 at 6:37 AM, Lex Williams <etaern@yahoo.com> wrote:

> when writing :
>
> string2 = string1
>
> both your variables reference the same address , so , modifications to
> any of them will cause modification to the other .
>
> If you write :
>
> string2 = string1.clone
>
> then you will modify just string2 , when writing sub!
> --
> Posted via http://www.ruby-....
>
>
But, why then, the following is not true???
n1 = 100
n2 = n2

To this point the are the same, including the object_id.
But when I assign:
n2 = 200
The n1 does not change and the object_id of n2 change.
Please see the irb session below.


irb
irb(main):001:0> n1 = 100
=> 100
irb(main):002:0> n2 = n1
=> 100
irb(main):003:0> p n1
100
=> nil
irb(main):004:0> p n2
100
=> nil
irb(main):005:0> p n1.object_id
201
=> nil
irb(main):006:0> p n2_object_id
NameError: undefined local variable or method `n2_object_id' for main:Object
from (irb):6
from :0
irb(main):007:0> p n2.object_id
201
=> nil
irb(main):008:0> n2 = 200
=> 200
irb(main):009:0> p n1
100
=> nil
irb(main):010:0> p n2
200
=> nil
irb(main):011:0> p n1.object_id
201
=> nil
irb(main):013:0> p n2.object_id
401
=> nil
irb(main):014:0>


Thank you

Ruby Student

David A. Black

10/5/2008 11:32:00 AM

0

Hi --

On Sun, 5 Oct 2008, Ruby Student wrote:

> On Sun, Oct 5, 2008 at 6:37 AM, Lex Williams <etaern@yahoo.com> wrote:
>
>> when writing :
>>
>> string2 = string1
>>
>> both your variables reference the same address , so , modifications to
>> any of them will cause modification to the other .
>>
>> If you write :
>>
>> string2 = string1.clone
>>
>> then you will modify just string2 , when writing sub!
>> --
>> Posted via http://www.ruby-....
>>
>>
> But, why then, the following is not true???
> n1 = 100
> n2 = n2
>
> To this point the are the same, including the object_id.
> But when I assign:
> n2 = 200
> The n1 does not change and the object_id of n2 change.

When you assign to a variable, you break any previous binding the
variable had.

a = "string"
b = a #1
b = 100 #2

At #1, the identifiers 'a' and 'b' refer to the same object. At #2,
however, 'b' has been bound to another object. Nothing you do to the
string in a will affect the object in b (100).


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.r... for details and updates!