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
on 2008-10-05 12:18
on 2008-10-05 12:38
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!
on 2008-10-05 13:28
On Sun, Oct 5, 2008 at 6:37 AM, Lex Williams <email@example.com> wrote: > > then you will modify just string2 , when writing sub! > -- > Posted via http://www.ruby-forum.com/. > > 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
on 2008-10-05 13:34
Hi -- On Sun, 5 Oct 2008, Ruby Student wrote: >> > > 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