在 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

ba 指向同一个对象。 b.downcasereturns 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

【讨论】:

【参考方案2】:

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

是的。

【讨论】:

***.com/questions/1872110/…,第二个答案似乎很好地解释了这一点。我要关闭它。

以上是关于在 Ruby 中按值传递是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在c ++ 11中按值捕获成员变量的好方法是啥? [复制]

Ruby 是按值传递还是按引用传递? [复制]

按值传递结果

为啥要在 C++ 中按值传递对象 [重复]

为啥我要在 C 中按值传递函数参数?

是否传递指针参数,在 C++ 中按值传递?