Ruby 对象引用
Ruby object references
我在 Ruby 中发现了一段让我感到困惑的代码。归结为下面一个简单的例子来说明。为什么在第一种情况下 sArr 的内容没有自动更新,而在第二种情况下却发生了?这些片段简短且不言自明,三个 returns 将两个场景分开。
2.0.0-p598 :068 > str = "Hello"
=> "Hello"
2.0.0-p598 :069 > sArr = [str]
=> ["Hello"]
2.0.0-p598 :070 > str = str.upcase
=> "HELLO"
2.0.0-p598 :071 > str
=> "HELLO"
2.0.0-p598 :072 > sArr
=> ["Hello"] # Why is this not ["HELLO"] like in the sequence below?
2.0.0-p598 :073 >
2.0.0-p598 :074 >
2.0.0-p598 :075 >
2.0.0-p598 :076 > str = "Hello"
=> "Hello"
2.0.0-p598 :077 > sArr = [str]
=> ["Hello"]
2.0.0-p598 :078 > str.upcase!
=> "HELLO"
2.0.0-p598 :079 > sArr
=> ["HELLO"]
这是因为使用 str = str.upcase
而不是 str.upcase!
创建了一个新的 String 实例:
str = "Hello"
str.object_id
# => 70132476337960
str = str.upcase
# => "HELLO"
str.object_id
# => 70132476374360 (new instance)
str = "Hello"
str.object_id
# => 70132476415240
str.upcase!
# => "HELLO"
str.object_id
# => 70132476415240 (same instance)
sArr
不受 str = str.upcase
的影响,因为它持有对初始 "Hello"
的引用。分配给 str
不会更改 sArr
中的对象,就像您分配给 str = 'World'
一样。相反,str.upcase!
修改了sArr
持有的实例。
我在 Ruby 中发现了一段让我感到困惑的代码。归结为下面一个简单的例子来说明。为什么在第一种情况下 sArr 的内容没有自动更新,而在第二种情况下却发生了?这些片段简短且不言自明,三个 returns 将两个场景分开。
2.0.0-p598 :068 > str = "Hello"
=> "Hello"
2.0.0-p598 :069 > sArr = [str]
=> ["Hello"]
2.0.0-p598 :070 > str = str.upcase
=> "HELLO"
2.0.0-p598 :071 > str
=> "HELLO"
2.0.0-p598 :072 > sArr
=> ["Hello"] # Why is this not ["HELLO"] like in the sequence below?
2.0.0-p598 :073 >
2.0.0-p598 :074 >
2.0.0-p598 :075 >
2.0.0-p598 :076 > str = "Hello"
=> "Hello"
2.0.0-p598 :077 > sArr = [str]
=> ["Hello"]
2.0.0-p598 :078 > str.upcase!
=> "HELLO"
2.0.0-p598 :079 > sArr
=> ["HELLO"]
这是因为使用 str = str.upcase
而不是 str.upcase!
创建了一个新的 String 实例:
str = "Hello"
str.object_id
# => 70132476337960
str = str.upcase
# => "HELLO"
str.object_id
# => 70132476374360 (new instance)
str = "Hello"
str.object_id
# => 70132476415240
str.upcase!
# => "HELLO"
str.object_id
# => 70132476415240 (same instance)
sArr
不受 str = str.upcase
的影响,因为它持有对初始 "Hello"
的引用。分配给 str
不会更改 sArr
中的对象,就像您分配给 str = 'World'
一样。相反,str.upcase!
修改了sArr
持有的实例。