Symbols
A typical implementation of a Ruby interpreter maintains a symbol table in which it stores the names of all the classes, methods, and variables it knows about. This allows such an interpreter to avoid most string comparisons: it refers to method names (for example) by their position in this symbol table. This turns a relatively expensive string operation into a relatively cheap integer operation.
These symbols are not purely internal to the interpreter; they can
also be used by Ruby programs. A Symbol object refers to a symbol. A symbol
literal is written by prefixing an identifier or string with a
colon:
:symbol # A Symbol literal
:"symbol" # The same literal
:'another long symbol' # Quotes are useful for symbols with spaces
s = "string"
sym = :"#{s}" # The Symbol :string
Symbols also have a %s
literal syntax that allows arbitrary delimiters in the same way
that %q and %Q can be used for string literals:
%s["] # Same as :'"'
Symbols are often used to refer to method names in reflective
code. For example, suppose we want
to know if some object has an each
method:
o.respond_to? :each
Here’s another example. It tests whether a given object responds to a specified method, and, if so, invokes that method:
name = :size if o.respond_to? name o.send(name) end
You can convert a String to a
Symbol using the intern or to_sym methods. And you can convert a Symbol back into a String with the to_s method or its alias id2name:
str = "string" # Begin with a string sym = str.intern # Convert ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access