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?
on 2009-05-25 19:19
on 2009-05-25 19:26
Mk 27 wrote: > like %w( ). So -- is there anything more that I need to understand > about this distinction? :x is a Symbol object. 'x' is a String. You can make a symbol from a string with the intern method, and a string from a symbol with the to_s method. A symbol is a named number that Ruby guarantees will have the same value throughout your program. You pick the name, Ruby picks the number.
on 2009-05-25 19:30
Mk 27 wrote: > 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 :-)
on 2009-05-25 19:32
On Mon, May 25, 2009 at 6:19 PM, Mk 27 <email@example.com> wrote: > 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. Rgds, Ben
on 2009-05-25 19:56
Hi, 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 and irb(main):003:0> :phone.methods.sort - 'phone'.methods => ["id2name", "to_int"] irb(main):004:0> String.instance_methods.sort - Symbol.instance_methods => [ ... (loads)] :phone.methods == Symbol.instance_methods Bertram
on 2009-05-25 20:13
On Mon, May 25, 2009 at 1:56 PM, Bertram Scharpf <firstname.lastname@example.org> wrote: > $ irb > => [ ... (loads)] > > :phone.methods == Symbol.instance_methods Strings are mutable, Symbols are immutable. There is only one instance of a Symbol with a given string 'value' so (hash1 == hash2) iff (hash1.object_id == hash2.object_id) 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. -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Twitter: http://twitter.com/RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale
on 2009-05-25 21:50
On 25.05.2009 20:13, Rick DeNatale wrote: > Strings are mutable, ... 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 `<main>' irb(main):002:0> ;-) Kind regards robert