【问题标题】: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 是指针的副本而不是对象吗?

【问题讨论】:

  • 你没有在这里传递任何参数,传递值甚至没有发挥作用。

标签: ruby


【解决方案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 是指针的副本而不是对象?

    是的。

    【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2014-04-09
    • 2011-04-17
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2014-11-07
    • 2011-07-10
    • 2016-08-17
    相关资源
    最近更新 更多