语法错误,意外的keyword_rescue,预期的keyword_end

时间:2018-08-07 11:55:03

标签: ruby rubocop

我有以下红宝石代码:

  EmailTemplate.for(mailer).each do |template|
    begin
      print '.'
      template.upload(publish)
    rescue Mandrill::UnknownTemplateError
      failed.push(mailer)
    end
  end

Rubocop将我的代码更正为:

EmailTemplate.for(mailer).each do |template|
    print '.'
    template.upload(publish)
  rescue Mandrill::UnknownTemplateError
    failed.push(mailer)
  end

现在返回以下错误:

syntax error, unexpected keyword_rescue, expecting keyword_end

我该如何解决?

Rubocop警告为:

C: Style/RedundantBegin: Redundant begin block detected.

2 个答案:

答案 0 :(得分:5)

Ruby 2.5.0添加了feature

  

救援/其他/确保现在可以直接与do / end块一起使用。 [功能#12906]

但是在此之前,这是不允许的。这样语法错误就会出现。

让我们对 sample.rb 中的代码进行语法测试:

[].each do |a|
  # ops
  rescue Exception => ex
  puts ex.inspect
end

从终端:

Ruby$ ruby -c sample.rb
sample.rb:3: syntax error, unexpected keyword_rescue
  rescue Exception => ex
        ^
sample.rb:5: syntax error, unexpected keyword_end, expecting end-of-input
Ruby$ rvm use 2.5.1
Using /Users/aruprakshit/.rvm/gems/ruby-2.5.1
Ruby$ ruby -c sample.rb
Syntax OK

请参见News。因此,在2.5.0之前,您需要这样写:

[].each do |a|
  begin
    # ops
  rescue => Exception
    puts ex.inspect
  end
end

您可以按照Setting the target Ruby version来配置Rubocop以选择所需的Ruby版本。

  

某些检查取决于Ruby解释器的版本,   被检查的代码必须继续运行。例如,使用Ruby 2.3+   安全的导航操作员,而不是尝试可以帮助您编写代码   更短,更一致...除非它必须在Ruby 2.2上运行。

     

如果在调用RuboCop的目录中存在.ruby-version,   RuboCop将使用其指定的版本。否则,用户可能会   RuboCop知道您的项目支持的最旧的Ruby版本   与:

AllCops:
  TargetRubyVersion: 2.4

答案 1 :(得分:3)

出于某种原因,Rubocop认为您正在运行Ruby 2.5,而不是Ruby 2.4.1。

您可以通过以下两种方法之一来解决此问题:

1)创建一个内容为.ruby-version的文件2.4.1。 Rubocop应该从该文件中提取您的Ruby版本。
2)将以下内容添加到您的.rubocop.yml

AllCops:
  TargetRubyVersion: 2.4