2014-07-30 3 views
0

Недавно я изучал рубин с koans, и я заметил одну вещь о символах и строковых объектах. Когда я назначил две разные переменные одинаковые символы, я обнаружил, что object_id были такими же.Различное поведение строк и символов?

2.1.1 :017 > symbol1 = :a 
=> :a 
2.1.1 :018 > symbol2 = :a 
=> :a 
2.1.1 :019 > symbol1.object_id 
=> 361768 
2.1.1 :020 > symbol2.object_id 
=> 361768 

Теперь, увидев это, я подумал, что это должны быть истинные строки и целые числа. Но когда я делал то же самое со строками, идентификатор объекта оказался другим.

2.1.1 :021 > string1 = "test" 
=> "test" 
2.1.1 :022 > string2 = "test" 
=> "test" 
2.1.1 :023 > string1.object_id 
=> 13977640 
2.1.1 :024 > string2.object_id 
=> 13932280 

Почему поведение символов и строк различно?

+1

Взгляните на это http://www.reactive.io/tips/2009/01/11/the-difference-between-ruby-symbols-and-strings/ - Ruby будет использовать символы, но не строки. – August

+0

Вот как создаются символы. Изучите [здесь] (http://rubyforadmins.com/strings-and-symbols#instances-and-reference) – Grych

ответ

5

Вы можете представить символы как самореферентные интернированные строки - то есть только одна копия данного символа будет когда-либо существовать. Это также относится к некоторым объектам, таким как экземпляры Fixnum, booleans или nil. Они не собираются мусором, не дублируются и не изменяются.

Струны, с другой стороны, являются сборщиками мусора, дублируемыми и изменяемыми. Каждый раз, когда вы объявляете строку, выделяется новый объект.

Смежные вопросы