Ruby 1.9 hash with a dash in a key

RubySyntaxHashRuby 1.9

Ruby Problem Overview


In ruby 1.9 is there a way to define this hash with the new syntax?

irb> { a:  2 }
=> {:a=>2}

irb> { a-b:  2 }
SyntaxError: (irb):5: syntax error, unexpected tLABEL
{ a-b:  2 }
      ^

with the old one, it's working:

irb> { :"a-b" =>  2 }
=> {:"a-b"=>2}

Ruby Solutions


Solution 1 - Ruby

There are some legitimate symbols that cannot be used with the new syntax. I cannot find a reference, but it appears that a symbol name matching /^[a-zA-Z_][a-zA-Z_0-9]*[!?]?$/ is allowed with the new syntax. The last character may be the special character "!" or "?".

For any symbol that does not meet these restrictions, you have to use the Ruby 1.8 syntax, :'my-symbol-name'

Solution 2 - Ruby

To use dashes with the new syntax:

<%= link_to "Link", link_path, {data: {something: 'value1', somethingelse: 'value2'}} %>

This will generate:

<a href="/link" data-something='value1' data-somethingelse='value2'>Link</a>

This might not exactly be your particular use case, but I found this post while trying to find an answer myself so I thought I'd share my findings.

Solution 3 - Ruby

You can combine the old and new syntax:

{a: 1, b: 2, :'c-c' => 3, d: 4}

Solution 4 - Ruby

As of Ruby 2.2, you also can use following syntax:

{a: 1, b: 2, 'c-c': 3, d: 4}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmakevoidView Question on Stackoverflow
Solution 1 - RubyWayne ConradView Answer on Stackoverflow
Solution 2 - RubyNateView Answer on Stackoverflow
Solution 3 - Rubysl80View Answer on Stackoverflow
Solution 4 - RubyStiigView Answer on Stackoverflow