【问题标题】:Why does this work under Ruby 1.9.3 and not under 1.8.7?为什么这在 Ruby 1.9.3 下工作而不是在 1.8.7 下工作?
【发布时间】:2012-01-11 18:28:30
【问题描述】:

我正在 Rails 中构建一个自定义表单生成器,并且我一直在关注这个很棒的 Rails Cast 视频 (http://railscasts.com/episodes/311-form-builders?view=asciicast)。

Ryan 使用这样的语句:

<%= form_for @project, builder: BootstrapFormBuilder do |f| %>

但在 1.8.7 下,这会出现一个神秘的错误消息。

Ruby 1.9.3 中的哪些变化使得它现在可以工作?

顺便说一句,以下确实在 1.8.7 中工作,但为什么呢?

<%= form_for(@project, :builder => BootstrapFormBuilder) do |f| %>

【问题讨论】:

  • Ruby 1.9+ 允许新的哈希语法key: value 也支持现有的:key =&gt; value

标签: ruby-on-rails ruby


【解决方案1】:

Ruby 1.9.3 中的哪些变化使得它现在可以工作?

Hash 文字有一种新语法,其键是 Symbols,它们是有效的标识符。而不是

{ :foo => 'bar', :baz => 42 }

你现在也可以写了

{ foo: 'bar', baz: 42 }

此语法是在 1.9.0 中引入的。

顺便说一句,以下在 1.8.7 中确实有效,但为什么呢?

因为这是同一件事,只是使用不同的语法编写。

【讨论】:

    【解决方案2】:

    哈希语法已扩展为允许用户使用类似 JavaScript 的样式。

    # Old syntax
    old_hash = { :name => 'Ruby', :influences => ['Perl', 'Python', 'Smalltalk'] }
    
    # New syntax (Ruby 1.9 only)
    new_hash = { name: 'Ruby', influences: ['Perl', 'Python', 'Smalltalk'] }
    

    http://peepcode.com/blog/2011/rip-ruby-hash-rocket-syntax

    【讨论】:

      【解决方案3】:

      Ruby 1.9 中更改了哈希语法。在所有版本的 Ruby 中,您都可以使用 key =&gt; value,但 Ruby 1.9 有一个新的 key: value 语法。这就是为什么您的第二个示例有效,但第一个无效的原因。

      【讨论】:

        【解决方案4】:

        因为这部分:

        builder: BootstrapFormBuilder
        

        这会创建一个哈希,但该语法仅在 Ruby 1.9+ 中允许使用。之前,要创建哈希,您必须这样做

        :builder => BootstrapFormBuilder
        

        这就是第二行在 1.8 中起作用的原因。

        【讨论】:

          【解决方案5】:

          Ruby 1.9 引入了另一种哈希语法:

          # Ruby 1.8 and 1.9
          h = { :a => 1, :b => 2 }
          
          # Ruby 1.9 only
          h = { a: 1, b: 2 }
          

          需要注意的是a:只是:a =&gt;的一个语法糖,也就是说a仍然是一个符号。

          【讨论】:

          • 有一个不错的blog post,作者不喜欢新语法,但给出了很好的论据
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-15
          相关资源
          最近更新 更多