Are strings mutable in Ruby? Are strings mutable in Ruby? ruby ruby

Are strings mutable in Ruby?


Yes, << mutates the same object, and + creates a new one. Demonstration:

irb(main):011:0> str = "hello"=> "hello"irb(main):012:0> str.object_id=> 22269036irb(main):013:0> str << " world"=> "hello world"irb(main):014:0> str.object_id=> 22269036irb(main):015:0> str = str + " world"=> "hello world world"irb(main):016:0> str.object_id=> 21462360irb(main):017:0>


Just to complement, one implication of this mutability is seem below:

ruby-1.9.2-p0 :001 > str = "foo" => "foo" ruby-1.9.2-p0 :002 > ref = str => "foo" ruby-1.9.2-p0 :003 > str = str + "bar" => "foobar" ruby-1.9.2-p0 :004 > str => "foobar" ruby-1.9.2-p0 :005 > ref => "foo" 

and

ruby-1.9.2-p0 :001 > str = "foo" => "foo" ruby-1.9.2-p0 :002 > ref = str => "foo" ruby-1.9.2-p0 :003 > str << "bar" => "foobar" ruby-1.9.2-p0 :004 > str => "foobar" ruby-1.9.2-p0 :005 > ref => "foobar" 

So, you should choose wisely the methods you use with strings in order to avoid unexpected behavior.

Also, if you want something immutable and unique throughout your application you should go with symbols:

ruby-1.9.2-p0 :001 > "foo" == "foo" => true ruby-1.9.2-p0 :002 > "foo".object_id == "foo".object_id => false ruby-1.9.2-p0 :003 > :foo == :foo => true ruby-1.9.2-p0 :004 > :foo.object_id == :foo.object_id => true