爆炸方法并不像我期望的那样在原地替代:
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"
为什么会这样,我应该如何以最有效的方式通过索引对字符串中的字符进行升级?
答案 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']
正如您所看到的,字符串实际上是分配在垃圾收集器中的某个地方,它无法从任何地方访问,因为没有对它的引用。