Symbols vs. Strings

I’m new to Ruby, but coming up to speed quickly. One question I still
have never seen a good explanation to is this: When is it preferred to a
key a hash with a symbol, and when is it keyed by string? Is this just
personal preference, or is there a rule of thumb?

For example, in the Rails book, the session variable is always populated
with symbols, i.e.:

session[:user] = User.new

It’s also obviously completely common throughout the Rails framework
(e.g., :controller =>, :action =>, etc.)

So, when should I use what…or what should I prefer?

John B. wrote:

I’m new to Ruby, but coming up to speed quickly. One question I still
have never seen a good explanation to is this: When is it preferred to a
key a hash with a symbol, and when is it keyed by string? Is this just
personal preference, or is there a rule of thumb?

For example, in the Rails book, the session variable is always populated
with symbols, i.e.:

session[:user] = User.new

It’s also obviously completely common throughout the Rails framework
(e.g., :controller =>, :action =>, etc.)

So, when should I use what…or what should I prefer?

This question comes up a lot. You can search the list archives for
comprehensive discussions. Try
http://groups.google.com/group/comp.lang.ruby/browse_frm/thread/7e9a4d1cb55d1c1f/e495f6051aebe0ae?lnk=gst&q=symbols+strings&rnum=3#e495f6051aebe0ae

On 5/29/07, John B. [email protected] wrote:

It’s also obviously completely common throughout the Rails framework
(e.g., :controller =>, :action =>, etc.)

So, when should I use what…or what should I prefer?

Symbols are ligh-weight, they don’t have so much methods to initialize
has strings:

irb(main):009:0> :asd.methods.size
=> 45
irb(main):010:0> “asd”.methods.size
=> 143

So thats why you use it in params or other places when you just need
the name. Also a difference is that a symbol :sym is :sym everywhere,
but a string “string” -only the string, not assigned to a variable- is
a different refence to a String object each time you write “string” .

Those are the most important diferences IMO. Sorry if i wasn’t that
clear tho.

Cheers

I think the second point that Emilio was making is the more important
one.
Let me try to clarify:

irb(main):008:0> puts “foo”.object_id
1724824
=> nil
irb(main):009:0> puts “foo”.object_id
1708744
=> nil
irb(main):010:0> puts :foo.object_id
3678478
=> nil
irb(main):011:0> puts :foo.object_id
3678478

You can see here that a new String object is created every time you use
a
literal string. With a symbol, however, you are re-using the same
object
anywhere you use a symbol with the same name. Using symbols can save
you a
lot of resources, both processor time and memory.

-dave

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

One thing to keep in mind is that, as far as I know, symbols are
never garbage collected, so their excessive/inappropriate use might
introduce risk of memory leaks.

George

On 30 May 2007, at 00:06, Dave Grijalva wrote:

irb(main):010:0> puts :foo.object_id
anywhere you use a symbol with the same name. Using symbols can

have never seen a good explanation to is this: When is it

irb(main):009:0> :asd.methods.size

Those are the most important diferences IMO. Sorry if i wasn’t
that clear
tho.

Cheers

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)

iD8DBQFGXTZcuHSlGoVGf7URAqhKAKC28rsjkJ7tv2f1rxsdidLachrB6QCgs50D
qqsnSiEX19rHfPqzA9z9/DI=
=tKg1
-----END PGP SIGNATURE-----