为什么危险的方法不能处理Ruby中String的字符元素



当我应用upcase!方法时,我得到:

a="hello"
a.upcase!
a # Shows "HELLO"

但是在另一种情况下:

b="hello"
b[0].upcase!
b[0]  # Shows h
b # Shows hello

我不明白为什么upcase!应用于b[0]没有任何效果

b[0]每次返回一个新的String。查看对象id:

b = 'hello'
# => "hello"
b[0].object_id
# => 1640520
b[0].object_id
# => 25290780
b[0].object_id
# => 24940620

当您选择字符串中的单个字符时,您没有引用特定字符,您正在调用执行评估的访问/mutator函数:

2.0.0-p643 :001 > hello = "ruby"
 => "ruby" 
2.0.0-p643 :002 > hello[0] = "R"
 => "R" 
2.0.0-p643 :003 > hello
 => "Ruby" 

在运行危险方法的情况下,访问器请求该值,然后对其进行操作并更新新变量,但是由于字符和字符串之间不再有连接,因此它不会更新引用。

2.0.0-p643 :004 > hello = "ruby"
 => "ruby" 
2.0.0-p643 :005 > hello[0].upcase!
 => "R" 
2.0.0-p643 :006 > hello
 => "ruby"