Заявление
foo = "bar"
создает новый объект в памяти. Если мы повторим утверждение
foo = "bar"
Создаем еще один объект
, чтобы получить более четкое представление, попробуйте следующий код на консоли ruby
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
вы получите вывод как
string bar with object id = 70358547221180
string bar with object id = 70358548927060
, который ясно показывает, что для одной и той же строки есть два разных объекта. Теперь, если вы используете символ, он создаст один объект на символ , поэтому
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
показывает
symbol bar with object id = 7523228
symbol bar with object id = 7523228
, что означает, что есть только один объект для: bar
далее символы неизменны , и вы не можете вызывать любые методы String, например #upcase, #split
для символов.
Сравнение символов выполняется быстрее, чем сравнение строк.
Символы можно рассматривать как постоянные / неизменные строки, которые образуют уникальный набор, который эффективно преобразуется в указатели памяти в куче. Это означает, что сравнение двух символов выполняется быстро, потому что вы просто сравниваете 2 целых числа (указатели памяти).
Строки являются изменяемыми, поэтому указатель памяти на их значение в куче может измениться после модификации. Это означает, что операции сравнения медленнее, поскольку могут существовать дубликаты, которые семантически эквивалентны.
Использует
используйте Symbol
, если вы уверены, что значение останется постоянным. Пример использования символов для ключей хеша,
используйте строку, если вы хотите изменить значение или использовать строковый метод для него.