当我应用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
当您选择字符串中的单个字符时,您不是在引用特定字符,而是在调用执行评估的访问器/修改器函数:
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"