1

尝试使用类常量分配属性读取器时出现模棱两可的 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
4

2 回答 2

3

这工作正常,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
于 2017-04-20T11:24:20.353 回答
2

我同意这样的构造:

attr_reader *FOO

不应该被认为是模棱两可的,因为返回attr_reader发生在一个无效的上下文中,因此执行乘法将是没有意义的并且可能是一个错误。

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

我们知道这一点,我在 RuboCop 回购中有一个 未解决的问题。然而,这个 cop 有点特别,因为它本质上只是对parsergem 诊断的一个包装。在不重新实现 cop 的情况下,可能不存在任何简单的方法来实现此异常。


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

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