# Symbols are puzzling me and not only symbols

**URL:** <https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413>\
**Category:** Rails\
**Created:** [July 14, 2007, 2:25pm UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413 "2007-07-14T14:25:57Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 14, 2007, 2:25pm UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/1 "2007-07-14T14:25:57Z")

</div>

Dear all,  
I’ve got two burning questions. Both regard the manipulation of the  
params hash.  
Imagine:  
params = {“commit”=\>“Add comment”, “comment”=\>{“message”=\>“foo”,  
“name”=\>“bar”, “answer”=\>“2”, “email”=\>“foo@bar”}}

So the params hash has two keys, one(‘commit’) points to a string the  
other(‘comment’) to an other hash.  
Normally I can do something like; params[:id] or whatever, now if I do  
that, params[:commit] it returns nil! Why?? params[‘commit’] works as  
expected.

On to the second question, when I have a large array or hash I used  
to(In Java/PHP etc) split them up in several lines. For example:  
tmp = {:message =\> ‘tmp’ ,:name =\> ‘tmp’ ,:email =\> ‘tmp’}

Would become:  
tmp = { :message =\> ‘tmp’  
,:name =\> ‘tmp’  
,:email =\> ‘tmp’  
}

I find this eaasier to read and easier to check for comma related  
errors. However Ruby fails to recognise this, failing with the error:  
syntax error, unexpected ‘,’, expecting ‘}’  
,:name =\> ‘tmp’  
^

Ruby is better kidding me. The interpreter doesn’t handle whitespace??  
Any comments on what I am doing wrong or why not ignoring whitespace  
is a good idea, I’d love to hear.

With kind regads

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 14, 2007, 2:36pm UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/2 "2007-07-14T14:36:46Z")

</div>

ah…  
what you experienced before with params[“id”] and params[:id] returned  
the same,  
was in fact the magic of rails,

and the HashWithIndifferentAccess,  
and extension of hash,  
which reacts indifferently to symbols vs. strings.

try;  
params = HashWithIndifferentAccess.new  
params[:id] = “this is the id”

params[“id”] will return “this is the id”  
params[:id] will return “this is the id”

* * *

alternatively.

params = {:id =\> “this is the id”, :commit =\> “this is the  
commit”}.with\_indifferent\_access.

* * *

harm wrote:

> Dear all,  
> I’ve got two burning questions. Both regard the manipulation of the  
> params hash.  
> Imagine:  
> params = {“commit”=\>“Add comment”, “comment”=\>{“message”=\>“foo”,  
> “name”=\>“bar”, “answer”=\>“2”, “email”=\>“foo@bar”}}
> 
> So the params hash has two keys, one(‘commit’) points to a string the  
> other(‘comment’) to an other hash.  
> Normally I can do something like; params[:id] or whatever, now if I do  
> that, params[:commit] it returns nil! Why?? params[‘commit’] works as  
> expected.

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 14, 2007, 2:41pm UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/3 "2007-07-14T14:41:29Z")

</div>

Yeah, ruby doesn’t care about spaces, but it does care about new lines.  
Which is good, at least it doesn’t rely on semi-colons.

for a multiline declaration with clarity of commas

tmp = {  
:message =\> ‘tmp’ ,  
:name =\> ‘tmp’ ,  
:email =\> ‘tmp’  
}

> On to the second question, when I have a large array or hash I used  
> to(In Java/PHP etc) split them up in several lines. For example:  
> tmp = {:message =\> ‘tmp’ ,:name =\> ‘tmp’ ,:email =\> ‘tmp’}
> 
> Would become:  
> tmp = { :message =\> ‘tmp’  
> ,:name =\> ‘tmp’  
> ,:email =\> ‘tmp’  
> }
> 
> I find this eaasier to read and easier to check for comma related  
> errors. However Ruby fails to recognise this, failing with the error:  
> syntax error, unexpected ‘,’, expecting ‘}’  
> ,:name =\> ‘tmp’

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 14, 2007, 3:18pm UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/4 "2007-07-14T15:18:41Z")

</div>

> > for a multiline declaration with clarity of commas
> > 
> > tmp = {  
> > :message =\> ‘tmp’ ,  
> > :name =\> ‘tmp’ ,  
> > :email =\> ‘tmp’  
> > }
> 
> At the very great risk of sounding curmudgeonly, could I put in a  
> heartfelt plea for people not to do that? It looks bizarre, and seems  
> to invite scrutiny in case there’s been some kind of mistake or  
> omission.

To be honest,  
the way I like to declare hashes is like this;

tmp = {  
:message =\> “tmp”,  
:name =\> “tmp”,  
:email =\> “tmp”,  
}

that’s how I like it.

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 14, 2007, 3:05pm UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/5 "2007-07-14T15:05:01Z")

</div>

Hi –

On Sat, 14 Jul 2007, Matthew R. wrote:

> Yeah, ruby doesn’t care about spaces, but it does care about new lines.  
> Which is good, at least it doesn’t rely on semi-colons.

There are some cases where spaces matter; for example:

irb(main):002:0\> puts (3) + 2  
5  
=\> nil  
irb(main):003:0\> puts(3) + 2  
3  
NoMethodError: undefined method `+’ for nil:NilClass

In the second one, it evaluated puts(3) (including actually puts’ing  
3) and then tries to add 2 to it, which fails.

Also:

irb(main):004:0\> puts puts (3)  
(irb):4: warning: don’t put space before argument parentheses  
3  
nil

which does the same as puts puts(3) but gives you that warning.

> for a multiline declaration with clarity of commas
> 
> tmp = {  
> :message =\> ‘tmp’ ,  
> :name =\> ‘tmp’ ,  
> :email =\> ‘tmp’  
> }

At the very great risk of sounding curmudgeonly, could I put in a  
heartfelt plea for people not to do that? It looks bizarre, and seems  
to invite scrutiny in case there’s been some kind of mistake or  
omission.

David

–

- Books:  
RAILS ROUTING (new! [http://www.awprofessional.com/title/0321509242](http://www.awprofessional.com/title/0321509242))  
RUBY FOR RAILS ([Ruby for Rails](http://www.manning.com/black))
- Ruby/Rails training  
& consulting: Ruby Power and Light, LLC ([http://www.rubypal.com](http://www.rubypal.com))

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 15, 2007, 11:43am UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/6 "2007-07-15T11:43:26Z")

</div>

Aha, but why does that scheme break down? Knowing that would prevent  
me from running future problems. The class documentation()http://  
[api.rubyonrails.org/classes/HashWithIndifferentAccess.html](http://api.rubyonrails.org/classes/HashWithIndifferentAccess.html)) does not  
bring me very far either. Especially the line:

> [@](#):
>
> this class has dubious semantics and we only have it so that people  
> can write params[:key] instead of params[‘key’]

does not inspire confidence.

On Jul 14, 2:36 pm, Matthew R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 15, 2007, 11:45am UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/7 "2007-07-15T11:45:27Z")

</div>

Hmmm, alright. I still don’t understand why the parser does not just  
run until it encounters an other curly brace (}). But I can live with  
it.

On Jul 14, 2:41 pm, Matthew R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![harm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/b4bc9f/32.png) [@harm](https://www.ruby-forum.com/u/harm)\
**Post date:** [July 15, 2007, 11:46am UTC](https://www.ruby-forum.com/t/symbols-are-puzzling-me-and-not-only-symbols/109413/8 "2007-07-15T11:46:27Z")

</div>

Interesing example! I should use that in class. Thanks.
