My sense is you have to consider how the underlying Symbol is created, represented and referenced in comparison to a String. Why?
Well, both Symbols
and Strings
appear similar in description, yet the application and the computers internal representation of them is uniquely different.
A string is used to store a string value, the value can be changed after creation.
A symbol is used to store a string value, the value cannot be changed after creation. All references to the Symbol point to the same location in memory.
If you copy a symbol you have two names but one memory location, if you copy a String the assignment operation creates a new memory object and copies the content of the string object into the storage of the second memory object. Thus, you have two names and two memory locations.
irb(main):002:0> symbol = :symbol
=> :symbol
irb(main):003:0> symbol.object_id
=> 824028
irb(main):004:0> symbol2 = symbol
=> :symbol
irb(main):005:0> symbol2.object_id
=> 824028
A symbol only has one memory instance to point too. Now lets consider a string:
irb(main):006:0> stringName = "Fred"
=> "Fred"
irb(main):007:0> stringName.object_id
=> 70308031841340
irb(main):008:0> stringName2 = stringName
=> "Fred"
irb(main):009:0> stringName2.object_id
=> 70308031841340
irb(main):010:0> stringName2 = "Frederick"
=> "Frederick"
irb(main):011:0> stringName.object_id
=> 70308031841340
irb(main):012:0> stringName2.object_id
=> 70308032061840
irb(main):013:0> stringName2 = "Fred"
=> "Fred"
irb(main):014:0> stringName.object_id
=> 70308031841340
irb(main):015:0> stringName2.object_id
=> 70308032090380
irb(main):016:0> stringName
=> "Fred"
irb(main):017:0> stringName2
=> "Fred"
as you can see the String upon copy creates a new object in memory that is a copy of the first. As soon as you change its content it creates a new object in memory to store the unique string from the first instance even if the string is the same. (i.e. "Fred")
Why use symbols?
Symbols are far more efficient in the use of memory than strings. Further, they are uniquely applicable to reference items you wish to refer to in your code. Once created they are guaranteed to stay the same.
I hope the above points you in the right direction.