【问题标题】:Why does this not work for Ruby 1.9.2?为什么这不适用于 Ruby 1.9.2?
【发布时间】:2011-09-08 22:17:49
【问题描述】:

以下代码不适用于 Ruby 1.9.2:

def side_box(title, &block)
  render :layout => 'layouts/side_box', :locals => {:title => title} do 
    &block
  end
end

我收到一个错误:

语法错误,意外篡改 &阻止

发生了什么变化(自 1.8.7 起)导致此功能不起作用?

【问题讨论】:

    标签: ruby-on-rails ruby block


    【解决方案1】:
    def side_box(title, &block)
      render :layout => 'layouts/side_box', :locals => {:title => title} do 
        yield
      end
    end
    

    或

    def side_box(title, &block)
      render :layout => 'layouts/side_box', :locals => {:title => title} do 
        block.call
      end
    end
    

    它适用于 Ruby 1.9 和 1.8。

    【讨论】:

      【解决方案2】:

      我目前没有安装 1.8.7,但我很确定这在 1.8.7 中也是非法的。一元前缀&运算符只在形参列表和实参列表中合法。

      【讨论】:

        【解决方案3】:

        基于 Simone 的回答,如果您的块接受参数 (arg1, arg2),正确的语法(在 1.8 和 1.9 中)将是

        def side_box(title, &block)
          render :layout => 'layouts/side_box', :locals => {:title => title} do 
            yield(arg1, arg2)
          end
        end
        

        或

        def side_box(title, &block)
          render :layout => 'layouts/side_box', :locals => {:title => title} do 
            block.call(arg1, arg2)
          end
        end
        

        【讨论】:

        • 如果您没有在第二个选项中捕捉到 &block,那么该选项应该是最快的
        【解决方案4】:

        我不知道,这在 1.8.7 中有效,正确的语法应该是

        block.call
        

        或

        block[]
        

        或

        render :layout => 'layouts/side_box', :locals => {:title => title}, &block
        

        【讨论】:

          猜你喜欢
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 2013-01-25
          • 1970-01-01
          • 2019-04-08
          • 2021-05-03
          • 1970-01-01
          • 2019-02-10
          相关资源
          最近更新 更多