Рубиновая неизменность строк и символов (что если мы сохраним их в переменных) - PullRequest
0 голосов
/ 05 октября 2018

Строка является примитивным типом;всякий раз, когда вы вызываете строку, она имеет новый идентификатор объекта.Символ является ссылочным типом;всякий раз, когда вы создаете символ, вы создаете указатель, который указывает на значение.

Я хранил символы в переменных:

var1 = :foo
var1.object_id # => 2598748
:foo.object_id # => 2598748

var2 = :foo
var2.object_id # => 2598748

var2 = "hello"
var2.object_id # => 70131755422100

Как это возможно, что я создал вторую переменную var2 и имеет тот же идентификатор объекта, что и var1?Я создаю второй элемент.Означает ли это, что переменные также являются указателями?

Обе переменные указывают на символ :foo.Символ :foo хранится только один раз, верно?

Две переменные созданы, поэтому они должны находиться в памяти, и они не могут находиться в одном и том же месте, поскольку имеют разные имена.var1 и var2 необходимо сохранить, чтобы я мог позвонить им позже.Я не понимаю, как я могу их вызвать, если у них одинаковый идентификатор объекта.Если кто-то может помочь мне понять это, я буду благодарен.

1 Ответ

0 голосов
/ 05 октября 2018

Переменные 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 всегда возвращает один и тот же идентификатор для одного и того же объекта, вы получаете один и тот же идентификатор.

...