【问题标题】:Haml::Engine#render: "can't modify frozen NilClass (RuntimeError)"Haml::Engine#render:“无法修改冻结的 NilClass (RuntimeError)”
【发布时间】:2015-08-29 16:51:08
【问题描述】:

我正在阅读 Pickaxe 书(第 281 页)的 Haml 部分,代码如下:

require 'haml'
engine = Haml::Engine.new(%{
%body
  #welcome-box
    %p= greeting
  %p
    As of
    = Time.now
    the reasons you gave were:
    %table
      %tr
        %th Reason
        %th Rank
      - for reason in reasons
        %tr
          %td= reason[:reason_name]
          %td= reason[:rank]
})

data = {
  greeting: 'Hello, Dave Thomas',
  reasons: [
    { reason_name: 'flexible',    rank: '87' },
    { reason_name: 'transparent', rank: '76' },
    { reason_name: 'fun',         rank: '94' },
  ]
}

puts engine.render(nil, data)

运行它会产生错误:

/Users/andrekibbe/.rvm/gems/ruby-2.2.1/gems/haml-4.0.7/lib/haml/engine.rb:136:in `block in render': can't modify frozen NilClass (RuntimeError)
    from /Users/andrekibbe/.rvm/gems/ruby-2.2.1/gems/haml-4.0.7/lib/haml/engine.rb:135:in `instance_eval'
    from /Users/andrekibbe/.rvm/gems/ruby-2.2.1/gems/haml-4.0.7/lib/haml/engine.rb:135:in `ensure in render'
    from /Users/andrekibbe/.rvm/gems/ruby-2.2.1/gems/haml-4.0.7/lib/haml/engine.rb:135:in `render'
    from haml_example.rb:17:in `<main>'

我对 Haml::Engine#render 语法感到困惑,根据documentation,该语法将块作为三个参数中的最后一个——而在上面的代码中,块是两个参数中的第一个。为什么block应该设置为“nil”?

【问题讨论】:

    标签: ruby haml


    【解决方案1】:

    您正在使用nil 作为范围Engine#render 的第一个参数) nil 在 Ruby 2.2 中被冻结。

    p nil.frozen? # Prints false in Ruby 2.0
    p nil.frozen? # Prints true in Ruby 2.2
    

    无法修改冻结的对象。因此,Ruby 不允许 Haml 在 nil 范围内执行 instance_eval。这就是我们看到错误的原因。

    您的代码在 Ruby 2.0 中运行良好。我的猜测是书中的示例是在 Ruby 2.2 之前编写的。

    要修复您的代码,请使用以下代码:

    puts engine.render(Object.new, data)
    

    PS:错误与render的第三个参数无关。您可以查看code of engine.rb 进行确认。

    【讨论】:

    • 啊,做到了。我假设第一个和第二个参数是可选的并且被跳过。 nil 状态的有趣变化。谢谢!
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2021-02-19
    • 2013-02-11
    相关资源
    最近更新 更多