为什么不夸大其词!方法在字符串上工作?

时间:2014-04-16 16:05:55

标签: ruby

爆炸方法并不像我期望的那样在原地替代:

2.0.0p247 :010 > string = "abc"
 => "abc" 
2.0.0p247 :011 > string[2]
 => "c" 
2.0.0p247 :012 > string[2].upcase!
 => "C" # so far so good...
2.0.0p247 :013 > string
 => "abc" # expected "abC"
2.0.0p247 :014 > string[2]
 => "c" # expected "C"

为什么会这样,我应该如何以最有效的方式通过索引对字符串中的字符进行升级?

2 个答案:

答案 0 :(得分:4)

string[2]返回一个新的字符串,该字符串被提升并被丢弃。您应该将其分配回字符串。

string = "abc"
string[2] = string[2].upcase
string # => "abC"

答案 1 :(得分:1)

string[2]返回一个字符串。该字符串就地upcase! d。但是,由于该字符串未在任何地方引用,因此您将永远不会注意到。

tmp = ObjectSpace.each_object(String).to_a

string = 'abc'
string[2].upcase!

ObjectSpace.each_object(String).to_a - tmp
# => ['C']

正如您所看到的,字符串实际上是分配在垃圾收集器中的某个地方,它无法从任何地方访问,因为没有对它的引用。