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