Ruby 1.9哈希,键中有一个破折号

mak*_*oid 55 ruby syntax hash ruby-1.9

在ruby 1.9中有没有办法用新语法定义这个哈希?

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

irb> { a-b:  2 }
SyntaxError: (irb):5: syntax error, unexpected tLABEL
{ a-b:  2 }
      ^
Run Code Online (Sandbox Code Playgroud)

与旧的,它的工作:

irb> { :"a-b" =>  2 }
=> {:"a-b"=>2}
Run Code Online (Sandbox Code Playgroud)

Way*_*rad 64

有一些合法的符号不能与新语法一起使用.我找不到引用,但似乎/^[a-zA-Z_][a-zA-Z_0-9]*[!?]?$/允许使用新语法进行符号名称匹配.最后一个字符可能是特殊字符"!" 要么 "?".

对于任何不符合这些限制的符号,您必须使用Ruby 1.8语法, :'my-symbol-name'

  • 我检查了`parse.c`,似乎用新语法将符号解析为`tLabel`标记.匹配名称更像/ [a-zA-Z _] [a-zA-Z0-9]/:-) (22认同)
  • 纯粹主义者的悲伤消息:( (3认同)
  • @prusswan - 我无法想象Ruby中的纯粹编程. (3认同)
  • 在Ruby 2.1和Rails 4.0中,将````data:{my_attr:'foo'}```传递给```button_tag```之类的辅助方法将产生```data-my-attr ="foo"` ``在渲染的HTML中 (2认同)

小智 25

要使用带有新语法的破折号:

<%= link_to "Link", link_path, {data: {something: 'value1', somethingelse: 'value2'}} %>
Run Code Online (Sandbox Code Playgroud)

这将产生:

<a href="/link" data-something='value1' data-somethingelse='value2'>Link</a>
Run Code Online (Sandbox Code Playgroud)

这可能不完全是您的特定用例,但我在尝试自己找到答案时发现了这篇文章,所以我想我会分享我的发现.

  • AFAIK,这是特定于`data`属性,如果你有其他破折号属性,你必须使用旧语法. (2认同)

小智 22

您可以组合旧语法和新语法:

{a: 1, b: 2, :'c-c' => 3, d: 4}
Run Code Online (Sandbox Code Playgroud)


Sti*_*iig 8

您还可以使用下一个语法

{a: 1, b: 2, 'c-c': 3, d: 4}
Run Code Online (Sandbox Code Playgroud)

  • @makevoid 新语法自 2.2 起可用:https://github.com/ruby/ruby/blob/v2_2_0/NEWS#language-changes (2认同)