def test_problem(str)
str[3].upcase! # str[3] = str[3].upcase! works
str
end
p test_problem("hello")
我的问题是为什么使用String.upcase!在上述情况下,哪种变异方法不会使字符串变异,但是您需要在字符串中重新分配该字符?
答案 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)
它确实使字符串变异。但是您忽略它,从不看它。因此,您不知道它是否被突变。