为什么"<<"和"+"与冻结的字符串对象的行为不同?

Aru*_*hit 1 ruby ruby-1.9.3

irb(main):009:0> a = "good"
=> "good"
irb(main):010:0> a = "good" + "morning"
=> "goodmorning"
irb(main):011:0> a = "good"
=> "good"
irb(main):012:0> a << " morning"
=> "good morning"
Run Code Online (Sandbox Code Playgroud)

到现在为止,两个concatenation运营商都运作良好.

irb(main):013:0> a = "good"
=> "good"

irb(main):014:0> a.freeze
=> "good"

irb(main):015:0> a.frozen?
=> true

irb(main):016:0> a << " welcome"
RuntimeError: can't modify frozen String
    from (irb):16
    from /usr/bin/irb:12:in `<main>'


irb(main):017:0> a = a +  " welcome"
=> "good welcome"
Run Code Online (Sandbox Code Playgroud)

但是对于一个frozen字符串,从中可以清楚地看到差异IRB,<<并且+表现不像他们应该的那样.谁能告诉我这个的原因?

Lin*_*ios 5

他们正在做的正是他们应该是什么.<< 修改它被调用的字符串,而+更接近str.dup << arg.此行为是已定义的文档标准.

  • @ user2060534:冻结的字符串很好,有自己的副本,只是没有自己修改,浅拷贝不复制像冻结的属性? (4认同)