在 Ruby 中按值传递是啥意思? [复制]
Posted
技术标签:
【中文标题】在 Ruby 中按值传递是啥意思? [复制]【英文标题】:What does pass by value mean in Ruby? [duplicate]在 Ruby 中按值传递是什么意思? [复制] 【发布时间】:2014-05-22 13:48:12 【问题描述】:我显然不太了解按值传递。
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>
为什么是小写,如果按值传递,那么 b 不是 a 的副本吗?
这是因为 a 是一个指向 String 对象的(引用|指针),因此 b 是指针的副本而不是对象吗?
【问题讨论】:
你没有在这里传递任何参数,传递值甚至没有发挥作用。 【参考方案1】: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
【讨论】:
【参考方案2】:这是因为 a 是一个指向 String 对象的(引用|指针)并且 因此 b 是指针的副本而不是对象?
是的。
【讨论】:
***.com/questions/1872110/…,第二个答案似乎很好地解释了这一点。我要关闭它。以上是关于在 Ruby 中按值传递是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章