Ruby 1.9中带有破折号的键的哈希表

57
在ruby 1.9中,是否有一种使用新语法来定义此哈希表的方法?
irb> { a:  2 }
=> {:a=>2}

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

使用旧的代码,它可以工作:

irb> { :"a-b" =>  2 }
=> {:"a-b"=>2}
4个回答

64

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

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


22
我查看了parse.c,似乎在新语法中,该符号被解析为tLabel标记。匹配的名称更像是/[a-zA-Z_][a-zA-Z0-9]/ :-)。 - MBO
3
@prusswan - 我无法想象一个纯粹主义者会使用Ruby进行编程。 - Wayne Conrad
2
在 Ruby 2.1 和 Rails 4.0 中,将 data: { my_attr: 'foo' } 传递给像 button_tag 这样的辅助方法,将在呈现的 HTML 中产生 data-my-attr="foo" - Chris Beck
1
如果问号和感叹号是冒号前的最后一个字符,它们也是有效的字符。就像方法名称一样。因此,这是有效的:{a: 1, b?: 2, c!: 3} - jwadsack
1
@ChrisBeck 在 Ruby 2.0 和 Rails 3.2 中同样适用,例如 data: { my_attr: 'foo' } -> data-my-attr="foo" - devius
显示剩余2条评论

24
使用新语法来添加破折号:
<%= link_to "Link", link_path, {data: {something: 'value1', somethingelse: 'value2'}} %>

这将生成:

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

这可能并不完全符合您的特定用例,但我在尝试寻找答案时发现了这篇文章,所以想分享我的发现。


2
据我所知,这仅适用于“data”属性,如果您有其他带破折号的属性,则必须使用旧语法。 - lime
1
HAML文档单独提到了数据属性。作为额外的奖励,您可以通过使用下划线来获得多个破折号:data: {author_id: 123}。非常棒的东西。 - lime

24
您可以结合旧语法和新语法:
{a: 1, b: 2, :'c-c' => 3, d: 4}

11

从 Ruby 2.2 开始,您还可以使用以下语法:

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

太棒了!+1 为更新新的 Ruby 语法感到高兴,它从哪个版本开始可用?2?2.1? - makevoid
我不知道,我只是尝试了这个语法,它起作用了 :) - Stiig
2
@makevoid自Ruby 2.2版本以来有新的语法可用: https://github.com/ruby/ruby/blob/v2_2_0/NEWS#language-changes - Eddy Mulyono
@EddyMulyono +1 - makevoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接