Один из простых способов обдумать это - подумать: «А что, если бы я использовал строку, а не символ?
patient1 = { "ruby" => "red" }
patient2 = { "ruby" => "programming" }
Это совсем не смущает, верно?
Вы используете "ruby" в качестве ключа в хэше .
"ruby"
- строковый литерал, так что это значение. Адрес памяти или указатель вам недоступен.
Каждый раз, когда вы вызываете "ruby"
, вы создаете его новый экземпляр, то есть создаете новую ячейку памяти, содержащую то же значение - "ruby"
.
Затем в хэше говорится: «Какое значение моего ключа? О, это "ruby"
». Затем сопоставляет это значение с «красным» или «программированием».
Другими словами, :ruby
не обращается к "red"
или "programming"
.
Хэш отображает :ruby
на "red"
или "programming"
.
Сравните это с тем, если мы используем символы
patient1 = { :ruby => "red" }
patient2 = { :ruby => "programming" }
Значение :ruby
также "ruby"
, эффективно.
Почему? Потому что символы по сути строковые константы .
Константы не имеют нескольких экземпляров. Это тот же адрес памяти. И адрес памяти имеет определенное значение, разыменованное. Для символов имя указателя является символом, а разыменованное значение является строкой, которая соответствует имени символа, в данном случае, "ruby"
.
В хеше вы используете не символ, указатель, а значение, на которое указывает ссылка. Вы используете не :ruby
, а "ruby"
.
Хеш затем ищет ключ "ruby"
, значение "red"
или "programming"
, в зависимости от того, как вы определили хеш.
Концепция смены парадигмы и возврата в исходное состояние заключается в том, что значение символа является совершенно отдельным понятием от значения, сопоставленного с хешем, с учетом ключа этого хеша.