Возможно, вы предполагаете, что объявление, которое вы сделали, определяет значение Symbol как нечто иное, чем оно есть. Фактически, Symbol - это просто «внутреннее» значение String, которое остается постоянным. Именно потому, что они хранятся с использованием простого целочисленного идентификатора, они часто используются, поскольку это более эффективно, чем управление большим количеством строк переменной длины.
Возьмите пример вашего примера:
patient1 = { :ruby => "red" }
Это должно читаться как: «объявить переменную Patient1 и определить ее как Hash, а в этом хранилище значение« red »под ключом (символ« ruby »)»
Другой способ написать это:
patient1 = Hash.new
patient1[:ruby] = 'red'
puts patient1[:ruby]
# 'red'
Когда вы выполняете задание, неудивительно, что результат, который вы получаете, идентичен тому, с чем вы его вначале присвоили.
Концепция Symbol может быть немного запутанной, поскольку она не характерна для большинства других языков.
Каждый объект String отличается, даже если значения идентичны:
[ "foo", "foo", "foo", "bar", "bar", "bar" ].each do |v|
puts v.inspect + ' ' + v.object_id.to_s
end
# "foo" 2148099960
# "foo" 2148099940
# "foo" 2148099920
# "bar" 2148099900
# "bar" 2148099880
# "bar" 2148099860
Каждый символ с одинаковым значением относится к одному и тому же объекту:
[ :foo, :foo, :foo, :bar, :bar, :bar ].each do |v|
puts v.inspect + ' ' + v.object_id.to_s
end
# :foo 228508
# :foo 228508
# :foo 228508
# :bar 228668
# :bar 228668
# :bar 228668
Преобразование строк в символы отображает одинаковые значения в один и тот же уникальный символ:
[ "foo", "foo", "foo", "bar", "bar", "bar" ].each do |v|
v = v.to_sym
puts v.inspect + ' ' + v.object_id.to_s
end
# :foo 228508
# :foo 228508
# :foo 228508
# :bar 228668
# :bar 228668
# :bar 228668
Аналогично, преобразование из Symbol в String каждый раз создает отдельную строку:
[ :foo, :foo, :foo, :bar, :bar, :bar ].each do |v|
v = v.to_s
puts v.inspect + ' ' + v.object_id.to_s
end
# "foo" 2148097820
# "foo" 2148097700
# "foo" 2148097580
# "bar" 2148097460
# "bar" 2148097340
# "bar" 2148097220
Вы можете думать о значениях символов как о чертях из внутренней хэш-таблицы, и вы можете видеть все значения, которые были закодированы в символы с помощью простого вызова метода:
Symbol.all_values
# => [:RUBY_PATCHLEVEL, :vi_editing_mode, :Separator, :TkLSHFT, :one?, :setuid?, :auto_indent_mode, :setregid, :back, :Fail, :RET, :member?, :TkOp, :AP_NAME, :readbyte, :suspend_context, :oct, :store, :WNOHANG, :@seek, :autoload, :rest, :IN_INPUT, :close_read, :type, :filename_quote_characters=, ...
По мере того, как вы определяете новые символы с помощью двоеточия или с помощью .to_sym, эта таблица будет расти.