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?

···

--
Posted via http://www.ruby-forum.com/.

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

···

--
Posted via http://www.ruby-forum.com/.

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

···

On 5/29/07, John Blanco <zablanc@yahoo.com> 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?

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

···

On 5/29/07, Emilio Tagua <miloops@gmail.com> wrote:

On 5/29/07, John Blanco <zablanc@yahoo.com> 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?

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

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:

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

On 5/29/07, Emilio Tagua <miloops@gmail.com> wrote:

On 5/29/07, John Blanco <zablanc@yahoo.com> 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?

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