1

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

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

但在另一种情况下:

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

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

4

2 回答 2

3

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

b = 'hello'
# => "hello"
b[0].object_id
# => 1640520
b[0].object_id
# => 25290780
b[0].object_id
# => 24940620
于 2015-05-17T14:33:58.550 回答
1

当您选择字符串中的单个字符时,您不是在引用特定字符,而是在调用执行评估的访问器/修改器函数:

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" 
于 2015-05-17T14:35:34.250 回答