我显然不太了解传递值。
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的副本?
这是因为a是String对象的(引用|指针),因此b是指针的副本而不是对象吗?
答案 0 :(得分:6)
Ruby中的每个对象都有自己的 id 。您可以使用#object_id
查看相同内容。请遵守代码:
a = "UPPER CASE STRING"
b = a
a.object_id # => 70041560
b.object_id # => 70041560
b
和a
指向同一个对象。 b.downcase
returns a copy of receiver with all uppercase letters replaced with their lowercase counterparts,而不是原封不动的原始字符串对象。这就是b.downcase
之后的原因,当您在 irb 中检查a
时,您在a
中没有看到相同的更改。但是,如果您在b
之后也看到b.downcase
,您还会看到b
的输出为"UPPER CASE STRING"
。
b.downcase.object_id # => 78657980
但是b.downcase!
changed the original string object。当您修改原始接收器 string 对象时,b
和a
现在都将输出为"upper case string"
。
b.downcase!.object_id # => 70041560
答案 1 :(得分:2)
这是因为a是String对象的(引用|指针) 因此b是指针的副本而不是对象?
是