Символы похожи на строки, но они неизменны - их нельзя изменить.
Они помещаются в память только один раз, что делает их очень эффективными для использования для таких вещей, как ключи в хешах, но они остаются в памятипока программа не выйдет.Это превращает их в память, если вы их неправильно используете.
Если вы динамически создаете много символов, вы выделяете много памяти, которую нельзя освободить, пока ваша программа не закончится.Вы должны только динамически создавать символы (используя string.to_sym
), если вы знаете, что:
- необходимо повторно обращаться к символу
- , не нужно изменять их
Как я уже говорил ранее, они полезны для таких вещей, как хеши - когда вам важнее идентичность переменной, чем ее значение.Символы, при правильном использовании, являются читаемым и эффективным способом передачи идентичности.
Я объясню, что я имею в виду относительно неизменности символов, RE ваш комментарий.
Строки похожи на массивы;их можно изменить на месте:
12:17:44 ~$ irb
irb(main):001:0> string = "Hello World!"
=> "Hello World!"
irb(main):002:0> string[5] = 'z'
=> "z"
irb(main):003:0> string
=> "HellozWorld!"
irb(main):004:0>
Символы больше похожи на числа;их нельзя редактировать по месту:
irb(main):011:0> symbol = :Hello_World
=> :Hello_World
irb(main):012:0> symbol[5] = 'z'
NoMethodError: undefined method `[]=' for :Hello_World:Symbol
from (irb):12
from :0