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