2016-02-06 2 views
0

Я пытаюсь понять очень тонкую реализацию Ruby с бай-ином ... или действительно по-ссылке-по-значению. Это имеет смысл при передаче аргументов в метод, однако, когда я наткнулся на следующее, я немного запутался:Как увидеть ссылки на объекты в 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, где вы можете «видеть» ссылки переменной?

Я принял само собой разумеющийся пишущий код, как в прошлом, но теперь, когда я пытаюсь понять, что происходит, я в тупике.

+0

Это все о 'binding'. Взгляните сюда для начинающих - http://ruby-doc.org/core-2.2.0/Binding.html – Jon

ответ

4

full_name относится к строковому объекту (на который также ссылаются person[:name]). Вызов << на нем изменяет этот строковый объект, а не переназначает что-то переменной с именем full_name.

full_name сам по себе не несет информацию о том, что его референт является значением для :name в хеше person. Просто бывает, что full_name и person[:name] указывают на один и тот же объект (id).

+1

Охх ... Я этого не видел. В этом есть смысл! Вот почему full_name.object_id совпадает с человеком [: name] .object_id ... СПАСИБО! –

Смежные вопросы