使用常量和使用rubocop的attr_reader进行Splat(*)运算符攻击

时间:2017-04-20 11:19:45

标签: ruby-on-rails ruby rubocop linter

尝试使用类常量分配属性读取器时,会出现模糊的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

2 个答案:

答案 0 :(得分:2)

这很好用,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

答案 1 :(得分:1)

我同意这样的结构:

attr_reader *FOO

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

此外,惯用的Ruby调用没有括号调用宏方法,并且在某些情况中添加括号的需要与此约定冲突。

我们知道这一点,我在RuboCop回购中有open issue。然而,这个警察有点特别,因为它基本上只是parser gem诊断的包装器。如果不重新实施警察,可能没有任何简单的方法可以解决这个问题。

目前,您有很多选择可以解决这个问题:

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