我试图理解Ruby非常微妙的传值实现......或者真正按值传递。将参数传递给方法时这是有道理的,但是当我遇到以下情况时,我有点困惑:
person = {name: "Michael"}
# => {:name => "Michael"}
person.object_id
# => 70366412279760
full_name = person[:name]
# => "Michael"
full_name.object_id
# => 70366412279780
full_name << " Jordan"
# => "Michael Jordan"
person
# => {:name => "Michael Jordan"}
这怎么可能? full_name如何包含对person对象的引用?在Ruby中是否有一种方法,你可以&#34;看到&#34;变量的引用?
我过去认为像上面那样编写代码是理所当然的,但现在我正在努力进一步了解发生了什么,我很难过。
答案 0 :(得分:4)
full_name
指的是一个字符串对象(也由person[:name]
引用)。在其上调用<<
会修改该字符串对象,而不是将某些内容重新分配给名为full_name
的变量。
full_name
本身并不包含其指示对象是散列:name
中person
的值的信息。恰好full_name
和person[:name]
指向同一个对象(id)。