views:

210

answers:

1

In ruby 1.9 there is 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}
+5  A: 

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. If the symbol name contains special characters such as '-', you have to use the Ruby 1.8 syntax, :'my-symbol-name'

Wayne Conrad
Which makes sense; how is the Ruby interpreter supposed to read that, otherwise?
Trevoke
I checked in `parse.c` and it seems that with the new syntax the symbol is parsed as `tLabel` token. And matching name is more like /[a-zA-Z_][a-zA-Z0-9]/ :-)
MBO
@MBO, Extra points for going to the source. I've edited the regex in my answer. Thanks!
Wayne Conrad