我有以下红宝石代码:
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.
答案 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