传递值是什么意味着Ruby?

时间:2014-04-09 11:33:26

标签: 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>

为什么小写,如果按值传递则不是a的副本?

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

2 个答案:

答案 0 :(得分:6)

Ruby中的每个对象都有自己的 id 。您可以使用#object_id查看相同内容。请遵守代码:

a = "UPPER CASE STRING"
b = a
a.object_id # => 70041560
b.object_id # => 70041560

ba指向同一个对象。 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 对象时,ba现在都将输出为"upper case string"

b.downcase!.object_id # => 70041560

答案 1 :(得分:2)

  

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