RichardOnRails wrote: > Given a String instance, how to create a different but equivalent one > > The code below shows the incorrect way and two correct ways > to create a second string instance that equal to a given string > instance. > > Q1: Are there better ways to do this than the two I concocted? > Q2: How can I create a proc to invoke it with each of my candidate > assignment statements > > I am interest in this issue because I made the naive assignment in a > project I am working on and > had to waste time trying debugging it. > > Thanks in advance, > Richard > > > # Version 1: Wrong! > > os = "abc" # Original String > ws = os # Thinking ws can be modified independently of os. > 3.times { ws << (ws[-1] + 1).chr; puts ws } > while ws.size > os.size > ws.chop; puts ws > end > > # Version 2: OK > > puts > os = "abc" # Original String > ws = String.new(os) # ws is a reference to a different string > oobject than os but initially equal to os > 3.times { ws << (ws[-1] + 1).chr; puts ws } > while ws.size > os.size > ws.chop!; puts ws > end > > # Version 3: OK > > puts > os = "abc" # Original String > ws = os + "" # A less verbose way to get a new string object > initially equal to os > 3.times { ws << (ws[-1] + 1).chr; puts ws } > while ws.size > os.size > ws.chop!; puts ws > end > > Use String.dup to create a copy irb(main):050:0> s1='hello' => "hello" irb(main):050:0> s2=s1 => "hello" irb(main):049:0> s1.eql? s2 => true irb(main):048:0> s1.equal? s2 => true irb(main):047:0> s3=s1.dup => "hello" irb(main):046:0> s3 => "hello" irb(main):045:0> s3.eql? s1 => true irb(main):044:0> s3.equal? s1 => false -- Kind Regards, Rajinder Yadav http://DevMentor.org Do Good! - Share Freely, Enrich and Empower people to Transform their lives.