Переменные Ruby являются ссылками на объекты, поэтому при отправке метода в переменную объект, на который он ссылается, является контекстом, в котором он оценивается.Вероятно, более ясно взглянуть на первое изображение в ответе с самым высоким рейтингом (ниже принятого ответа) здесь .
Итак, чтобы выяснить, что происходит, давайте углубимся в документацию:и посмотрим, что произойдет с вашим фрагментом кода.
Документация по классу Ruby's Symbol
: https://ruby -doc.org / core-2.5.0 / Symbol.html
Объекты символов представляют имена и некоторые строки внутри интерпретатора Ruby.Они генерируются с использованием синтаксиса литералов: name и: "string" и с помощью различных методов to_sym. Один и тот же объект Symbol будет создан для данного имени или строки на время выполнения программы, независимо от контекста или значения этого имени. Таким образом, если Fred является константой в одном контексте, метод вдругой, и класс в третьем, Symbol: Fred будет одним и тем же объектом во всех трех контекстах.
Документация Ruby Object#object_id
: https://ruby -doc.org / core-2.5.1 / Object.html # method-i-object_id
Возвращает целочисленный идентификатор для obj.
Один и тот же номер будет возвращен для всехвызывает object_id для данного объекта, и никакие два активных объекта не будут иметь идентификатора.
Так вот, что происходит пошагово:
# We create two variables that refer to the same object, :foo
var1 = :foo
var2 = :foo
var1.object_id = 2598748
var2.object_id = 2598748
# Evaluated as:
# var1.object_id => :foo.object_id => 2598748
# var2.object_id => :foo.object_id => 2598748
Каккак обсуждалось в первой ссылке выше, Ruby является передачей по значению, но каждое значение равно Object
, поэтому ваши переменные имеют одинаковое значение.Поскольку каждый символ, состоящий из одной и той же строки (в данном случае "foo"
), ссылается на один и тот же объект, а Object#object_id
всегда возвращает один и тот же идентификатор для одного и того же объекта, вы получаете один и тот же идентификатор.