【问题标题】:Splat (*) operator offense with constant and attr_reader with rubocopSplat (*) 操作员攻击与常量和 attr_reader 与 rubocop
【发布时间】:2017-09-17 00:02:45
【问题描述】:

在尝试使用类常量分配属性读取器时遇到一个模棱两可的 splat 运算符错误。

Class X1
  CONST = [:a, :b, :c]
  attr_reader *CONST
end

但是,我尝试了一些变通方法,但仍会导致 rubocop 攻击/语法错误。以下是一些尝试过的方法:

Class X1
  CONST = [:a, :b, :c]
  attr_reader(*CONST)
end


Class X1
  CONST = [:a, :b, :c]
  attr_reader(*(CONST))
end

【问题讨论】:

  • class 而不是 Class
  • attr_reader(*CONST) 不会冒犯 Rubocop。

标签: ruby-on-rails ruby rubocop linter


【解决方案1】:

这很好用,Rubocop 没有发现任何可抱怨的地方(除了X1 上缺少文档):

class X1
  CONST = %i[a b c].freeze
  attr_reader(*CONST)
end

x = X1.new
p x.a
# nil
p x.b
# nil
p x.c
# nil

【讨论】:

  • @Ilya:谢谢。有些准则对我来说似乎很武断。
  • 是的,从 %i()%i[] 的更改似乎是不知从何而来的,所以我们禁用了这个,因为这个更改什么也没带来,只会弄乱 git diff/blame 历史记录。跨度>
  • @AndreyDeineko:来自ruby-style-guidelines:“[] 用于数组文字(%w, %i, %W, %I),因为它与标准数组文字对齐。”没错,似乎不值得修改 repo。
【解决方案2】:

我同意这样的结构:

attr_reader *FOO

不应被视为模棱两可,因为 attr_reader 的返回发生在 void 上下文中,因此执行乘法将毫无意义并且可能是错误的。

此外,惯用的 Ruby 要求调用不带括号的宏方法,并且在某些情况下需要添加括号与此约定相冲突。

我们知道这一点,我在 RuboCop 存储库中有一个open issue。然而,这个 cop 有点特别,因为它本质上只是对 parser gem 诊断的包装。如果不重新实现 cop,可能不存在任何简单的方法来实现此异常。


目前,您有多种选择可以解决此问题:

  • 对带有 splat 参数的宏方法使用括号。
  • 使用rubocop:disable 指令为该攻击的每个实例内联禁用警察。 (这可能可行,也可能不可行,具体取决于违规次数。)
  • 完全禁用此警察,直到问题得到解决。

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2016-04-11
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多