为什么字符串中的字符没有突变?

时间:2018-06-29 18:08:08

标签: ruby string

def test_problem(str)
  str[3].upcase! # str[3] = str[3].upcase! works
  str
end

p test_problem("hello")

我的问题是为什么使用String.upcase!在上述情况下,哪种变异方法不会使字符串变异,但是您需要在字符串中重新分配该字符?

2 个答案:

答案 0 :(得分:6)

String#[]返回一个新字符串,as is documented

a = "foo"
a.object_id
# => 70217975553640

a[0].object_id
# => 70217957574840

字符串不是由字符对象组成的,它是单个对象(至少在表面上,我不确定C的内部结构)。因此,无法提取字符并仍然将其归为原始字符串-如果要对其进行突变,则需要对整个字符串进行处理。

另一方面,

String#[]=确实使字符串变异

您可以使方法如下:

def test_problem(str)
  str[3] = str[3].upcase # dont use bang methods when assigning
  str
end

答案 1 :(得分:1)

确实使字符串变异。但是您忽略它,从不看它。因此,您不知道它是否被突变。