Are strings mutable in Ruby?

前端 未结 3 1125
我在风中等你
我在风中等你 2020-12-03 09:55

Are Strings mutable in Ruby? According to the documentation doing

str = \"hello\"
str = str + \" world\"

creates a new string object with

相关标签:
3条回答
  • 2020-12-03 10:28

    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
    => 22269036
    irb(main):013:0> str << " world"
    => "hello world"
    irb(main):014:0> str.object_id
    => 22269036
    irb(main):015:0> str = str + " world"
    => "hello world world"
    irb(main):016:0> str.object_id
    => 21462360
    irb(main):017:0>
    
    0 讨论(0)
  • 2020-12-03 10:32

    Yes, they are:

    x = "hallo"
    x[1] = "e"
    
    p x # "hello"
    
    0 讨论(0)
  • 2020-12-03 10:37

    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 
    
    0 讨论(0)
提交回复
热议问题