我显然不太了解传递值.
irb(main):001:0> a="UPPER CASE STRING"
=> "UPPER CASE STRING"
irb(main):002:0> b=a
=> "UPPER CASE STRING"
irb(main):003:0> a
=> "UPPER CASE STRING"
irb(main):004:0> b
=> "UPPER CASE STRING"
irb(main):005:0> b.downcase
=> "upper case string"
irb(main):006:0> a
=> "UPPER CASE STRING"
irb(main):007:0> b.downcase!
=> "upper case string"
irb(main):008:0> b
=> "upper case string"
irb(main):009:0> a
=> "upper case string"
irb(main):010:0>
为什么是小写,如果通过值然后不是一个副本?
这是因为a是String对象的(引用|指针),因此b是指针的副本而不是对象吗?
Ruby中的每个对象都有自己的id.你可以看到相同的使用#object_id.关注代码:
a = "UPPER CASE STRING"
b = a
a.object_id # => 70041560
b.object_id # => 70041560
b并a指向同一个对象.b.downcase 返回一个接收器的副本,所有大写字母都用它们的小写字母替换,而不是缩小原始字符串对象.这就是之后的原因,当你在irb检查时b.downcase,你没有看到同样的变化.但是如果你也在考虑之后,你也会看到as 的输出.aabb.downcaseb"UPPER CASE STRING"
b.downcase.object_id # => 78657980
但b.downcase! 改变了原来的字符串对象.当你修改了原来接收的字符串对象,因此b和a双方现在作为输出"upper case string".
b.downcase!.object_id # => 70041560