【问题标题】:Allow braces for blocks that return允许返回块的大括号
【发布时间】:2015-12-29 07:43:46
【问题描述】:

当我编写一个返回值的多行块时,我喜欢使用大括号而不是do-end,以表明该块的目的是返回东西,而不是做事物。

Rubocop 的标准配置不允许这样做,rubocop -a 转换 do-end 块中的任何多行块。

# I like but Rubocop hates.
expect {
  delete :destroy, id: thing.to_param
}.to change(Thing, :count).by(-1)

# I don't like but Rubocop does.
expect do
  delete :destroy, id: thing.to_param
end.to change(Thing, :count).by(-1)

# That, we both like.
before do
  stub_api_calls
  admin_sign_in create(:super_admin)   
end

Rubocop 中是否有任何配置参数允许这种区分?

编辑:或者,至少,如果右括号后有一个点 (.),则可以避免更改括号块。

【问题讨论】:

  • 显然,您不能让 Rubocop 区分该方法是打算返回某事还是做某事。那是务实的,而不是语义的。所以你所能做的就是,如果可能的话,关闭 Rubocop 对多行块的do ...end 的偏好。
  • 好吧,Rubocop 很容易意识到,如果在右括号后面有一个点 (. )。
  • 如果块是方法定义中最后一个表达式的一部分怎么办?
  • 那么我不会太关心 do-end 块,因为我没有将返回值与下一个方法链接起来。

标签: ruby rubocop


【解决方案1】:

我发现有一个名叫Style/BlockDelimiters 的警察可以解决问题。配置为语义,它在功能块周围强制使用大括号并在命令式代码周围执行..end。

这是我添加到.rubocop.yml的内容:

# Allow curly braces for functional blocks
BlockDelimiters:
  EnforcedStyle: semantic

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多