【问题标题】:Ruby 1.9 hash with a dash in a keyRuby 1.9 哈希,键中有破折号
【发布时间】:2011-01-09 05:36:28
【问题描述】:

在 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}

【问题讨论】:

    标签: ruby syntax hash ruby-1.9


    【解决方案1】:

    有些合法符号不能用于新语法。我找不到参考,但似乎新语法允许匹配/^[a-zA-Z_][a-zA-Z_0-9]*[!?]?$/ 的符号名称。最后一个字符可能是特殊字符“!”或“?”。

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

    【讨论】:

    • 这是有道理的;否则,Ruby 解释器应该如何读取它?
    • 我签入了parse.c,似乎使用新语法,符号被解析为tLabel 令牌。匹配名称更像 /[a-zA-Z_][a-zA-Z0-9]/ :-)
    • @prusswan - 我无法想象一个纯粹的 Ruby 编程。
    • 在 Ruby 2.1 和 Rails 4.0 中,将 data: { my_attr: 'foo' } 传递给像 button_tag 这样的辅助方法将在呈现的 HTML 中生成 data-my-attr="foo"
    • ?和 !如果它们是冒号之前的最后一个字符,它们也是有效字符。类似于方法名称。所以这是有效的:{a: 1, b?: 2, c!: 3}
    【解决方案2】:

    在新语法中使用破折号:

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

    这将生成:

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

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

    【讨论】:

    • AFAIK,这是特定于 data 属性的,如果您有其他带有破折号的属性,则必须使用旧语法。
    • HAML documentation 单独提及数据属性。作为奖励,您可以使用下划线获得多个破折号:data: {author_id: 123}。很棒的东西。
    【解决方案3】:

    您可以结合新旧语法:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      猜你喜欢
      • 2012-11-19
      • 2012-02-06
      • 2011-07-15
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多