Symbols vs. Strings

J

John Blanco

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?
 
T

Tim Hunter

John said:
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...gst&q=symbols+strings&rnum=3#e495f6051aebe0ae
 
E

Emilio Tagua

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?

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
 
G

George Malamidis

-----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

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

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?

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

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

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,734
Messages
2,569,441
Members
44,832
Latest member
GlennSmall

Latest Threads

Top