传递值是什么意味着Ruby?

Dea*_*ith 0 ruby

我显然不太了解传递值.

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>
Run Code Online (Sandbox Code Playgroud)

为什么是小写,如果通过值然后不是一个副本?

这是因为a是String对象的(引用|指针),因此b是指针的副本而不是对象吗?

Aru*_*hit 6

Ruby中的每个对象都有自己的id.你可以看到相同的使用#object_id.关注代码:

a = "UPPER CASE STRING"
b = a
a.object_id # => 70041560
b.object_id # => 70041560
Run Code Online (Sandbox Code Playgroud)

ba指向同一个对象.b.downcase 返回一个接收器的副本,所有大写字母都用它们的小写字母替换,而不是缩小原始字符串对象.这就是之后的原因,当你在irb检查时b.downcase,你没有看到同样的变化.但是如果你也在考虑之后,你也会看到as 的输出.aabb.downcaseb"UPPER CASE STRING"

b.downcase.object_id # => 78657980
Run Code Online (Sandbox Code Playgroud)

b.downcase! 改变了原来的字符串对象.当你修改了原来接收的字符串对象,因此ba双方现在作为输出"upper case string".

b.downcase!.object_id # => 70041560
Run Code Online (Sandbox Code Playgroud)