Being totally new to ruby, I just noticed that using
bob[‘phone’]
which coming from perl is a style I’m used to, results in a separate key
than
bob[:phone]
That seems slightly weird, I had assumed the :form is just a shorthand
like %w( ). So – is there anything more that I need to understand
about this distinction?
Being totally new to ruby, I just noticed that using
bob[‘phone’]
which coming from perl is a style I’m used to, results in a separate key
than
bob[:phone]
That seems slightly weird, I had assumed the :form is just a shorthand
like %w( ). So – is there anything more that I need to understand
about this distinction?
Yes. :phone is a Symbol literal, whereas ‘phone’ is a String literal.
Symbols and Strings are two different types of object entirely. In
particular:
Symbols are immutable
a literal like :foo will always give exactly the same object instance
throughout the lifetime of the program, whereas a string literal like
‘foo’ will give a fresh object every time it is used
For this reason, symbols are somewhat more efficient for hash lookups.
Some libraries use them for passing hashes of options, although I
suspect this is more because they are one character shorter to type,
rather than any particular performance reason
like %w( ). So – is there anything more that I need to understand
about this distinction?
The first example is indexing via a string, the second is via a ruby
symbol.
You can think of a symbol as essentially a (very) lightweight string
usually
used for keying into hashes and general naming of things.
Am Dienstag, 26. Mai 2009, 02:19:29 +0900 schrieb Mk 27:
bob[‘phone’]
bob[:phone]
That seems slightly weird, I had assumed the :form is just a shorthand
like %w( ). So – is there anything more that I need to understand
about this distinction?
$ irb
irb(main):001:0> :phone.class
=> Symbol
irb(main):002:0> ‘phone’.class
=> String
Well, most of the time - but sometimes they aren’t:
irb(main):001:0> “I am not”.freeze.upcase!
RuntimeError: can’t modify frozen string
from (irb):2:in upcase!' from (irb):2 from /usr/local/bin/irb19:12:in’
irb(main):002:0>
This is the main property of a Symbol, it’s used for keys in Hashes
where lookup performance is important (like the method hashes used
internally by Ruby), since it means that Hash#== is O(1) and doesn’t
depend on the ‘length’
The downside is that Symbols can’t be garbage collected (at least for
the MRI implementation) in order to preserve the id/value invariant a
list of all string values which have been ‘interned’ when a Hash has
been created needs to be kept.
In Rails, it’s common to see Symbol and String keys used
‘interchangeably’, but this is only possible because Rails provides a
HashWithIndifferentAccess class which actually uses string keys
internally (because of the GC issue) but allows either to be used as
key arguments to methods.