Symbols and strings

M

maghac

Hi,
as a long-term perl user just recently converted to ruby, I'm curious
about one particular syntax "feature": ruby symbols and how they
relate to strings.

Isn't really :name a shortcut for "name"? (I read somewhere in an
explanation of attr_reader that e.g :age was the "name" of the
variable age, while age is the actual content of that variable). If
so, couldn't you use this in hash keys as well, e.g say hashvar[:key]
instead of hashvar['key'].

Are there situations where you cannot use symbols instead of strings,
or the other way around?

I might be too used to the way strings and barewords are handled in
perl (if something looks like a string, and it's not a function call,
it's interpreted as a string. This means you can say $hashvar{key}
without quoting the key).
 
R

Robert Dober

Hi,
as a long-term perl user just recently converted to ruby, I'm curious
about one particular syntax "feature": ruby symbols and how they
relate to strings.

Isn't really :name a shortcut for "name"? (I read somewhere in an
explanation of attr_reader that e.g :age was the "name" of the
variable age, while age is the actual content of that variable). If
so, couldn't you use this in hash keys as well, e.g say hashvar[:key]
instead of hashvar['key'].

Are there situations where you cannot use symbols instead of strings,
or the other way around?

I might be too used to the way strings and barewords are handled in
perl (if something looks like a string, and it's not a function call,
it's interpreted as a string. This means you can say $hashvar{key}
without quoting the key).
This question is asked very frequently, please search the archives for
more info.
I will try to give a very quick answer nevertheless:

Symbols are immutable, thus great to represent immutable data, often
that makes them an excellent choice for hash keys
{ :the_value => 42, :alternatively => 22, :eek:r_even => 101010 }
they just do not play the role of Strings, coming from Perl you just
had to use Strings, you did not have a tool for names (wait a moment
was there not such a thing as references to constants?).
Very roughly put I see Symbols as name, and Strings as data, whenever
I can use Symbols I use them, comes natural after some time.

HTH
Robert
 
S

Stefano Crocco

Alle marted=EC 14 agosto 2007, maghac ha scritto:
Hi,
as a long-term perl user just recently converted to ruby, I'm curious
about one particular syntax "feature": ruby symbols and how they
relate to strings.

Isn't really :name a shortcut for "name"? (I read somewhere in an
explanation of attr_reader that e.g :age was the "name" of the
variable age, while age is the actual content of that variable). If
so, couldn't you use this in hash keys as well, e.g say hashvar[:key]
instead of hashvar['key'].

Are there situations where you cannot use symbols instead of strings,
or the other way around?

I might be too used to the way strings and barewords are handled in
perl (if something looks like a string, and it's not a function call,
it's interpreted as a string. This means you can say $hashvar{key}
without quoting the key).

Symbols and strings are two different things. There are several situations =
in=20
which you can pass a method either a symbol or a string, but this happens=20
because who wrote the method took into account both possibilities. For=20
instance, attr_reader and similar, send, instance_variable_get and=20
instance_variable_set, define_method can take both a string or a symbol.=20
Module#const_get, instead, only accepts a symbol.

You can see that string and symbols are different using hashes:

h =3D { :a =3D> 1}
puts h[:a]
=3D> 1
puts h['a']
=3D> nil
h['a'] =3D 2
puts h['a']
=3D> 2
puts h[:a]
=3D> 1

There have been several threads on this topic. I suggest you look at them.

I hope this helps

Stefano
 
M

maghac

Hi,
as a long-term perl user just recently converted to ruby, I'm curious
about one particular syntax "feature": ruby symbols and how they
relate to strings.
Isn't really :name a shortcut for "name"? (I read somewhere in an
explanation of attr_reader that e.g :age was the "name" of the
variable age, while age is the actual content of that variable). If
so, couldn't you use this in hash keys as well, e.g say hashvar[:key]
instead of hashvar['key'].
Are there situations where you cannot use symbols instead of strings,
or the other way around?
I might be too used to the way strings and barewords are handled in
perl (if something looks like a string, and it's not a function call,
it's interpreted as a string. This means you can say $hashvar{key}
without quoting the key).

This question is asked very frequently, please search the archives for
more info.
I will try to give a very quick answer nevertheless:

Symbols are immutable, thus great to represent immutable data, often
that makes them an excellent choice for hash keys
{ :the_value => 42, :alternatively => 22, :eek:r_even => 101010 }
they just do not play the role of Strings, coming from Perl you just
had to use Strings, you did not have a tool for names (wait a moment
was there not such a thing as references to constants?).
Very roughly put I see Symbols as name, and Strings as data, whenever
I can use Symbols I use them, comes natural after some time.

HTH
Robert

Thanks, that cleared a few things for me.

I found something in the FAQ about it, but it didn't really answer my
question on the differences/similiarities between symbols and strings.

thanks
Magnus
 
T

Tim Hunter

maghac said:
Hi,
as a long-term perl user just recently converted to ruby, I'm curious
about one particular syntax "feature": ruby symbols and how they
relate to strings.

Isn't really :name a shortcut for "name"? (I read somewhere in an
explanation of attr_reader that e.g :age was the "name" of the
variable age, while age is the actual content of that variable). If
so, couldn't you use this in hash keys as well, e.g say hashvar[:key]
instead of hashvar['key'].

Are there situations where you cannot use symbols instead of strings,
or the other way around?

I might be too used to the way strings and barewords are handled in
perl (if something looks like a string, and it's not a function call,
it's interpreted as a string. This means you can say $hashvar{key}
without quoting the key).
This question is asked very frequently, please search the archives for
more info.
I will try to give a very quick answer nevertheless:

Symbols are immutable, thus great to represent immutable data, often
that makes them an excellent choice for hash keys
{ :the_value => 42, :alternatively => 22, :eek:r_even => 101010 }
they just do not play the role of Strings, coming from Perl you just
had to use Strings, you did not have a tool for names (wait a moment
was there not such a thing as references to constants?).
Very roughly put I see Symbols as name, and Strings as data, whenever
I can use Symbols I use them, comes natural after some time.

HTH
Robert

Thanks, that cleared a few things for me.

I found something in the FAQ about it, but it didn't really answer my
question on the differences/similiarities between symbols and strings.

thanks
Magnus
Don't make more out of this than there is. A symbol is a kind of literal
in Ruby. It's the name of a number. You pick the name, Ruby picks the
number. Ruby guarantees that whenever you use the symbol in your program
it will always refer to the same number.

That's it. That's all there is. Really.

Given a symbol, you can retrieve its name in the form of a string with
the #to_s method. You can convert a string (or almost any sequence of
characters, for that matter) to a symbol with the #to_sym method. Most
methods that accept symbol arguments, like attr_reader and kin, accept
strings as well. All attr_reader does with your symbol is use its name
as the name of the attribute.
 
P

Phlip

Tim said:
Don't make more out of this than there is. A symbol is a kind of literal
in Ruby. It's the name of a number. You pick the name, Ruby picks the
number. Ruby guarantees that whenever you use the symbol in your program
it will always refer to the same number.

:foo.object_id == :foo.object_id

So if you add a method to one :foo, can anyone who invokes :foo access
the method?
 
D

dblack

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

No members online now.

Forum statistics

Threads
473,965
Messages
2,570,148
Members
46,710
Latest member
FredricRen

Latest Threads

Top