Ruby rubocop:如何冻结用splat生成的数组常量

Dir*_*ins 4 ruby constants freeze splat rubocop

我正在分配一个像这样的数组常量:

NUMS = *(2..9)
Run Code Online (Sandbox Code Playgroud)

Rubocop说

C:冻结分配给常量的可变对象.               NUMS
=*(
2..9 )^^^^^


所以我试试

NUMS = *(2..9).freeze
Run Code Online (Sandbox Code Playgroud)

Rubocop说

C:冻结分配给常量的可变对象.
NUMS =*(2..9).freeze
               ^^^^^^^^^^^^


试着

NUMS = (*(2..9)).freeze
Run Code Online (Sandbox Code Playgroud)

Rubocop说

E:意外的令牌tRPAREN(使用Ruby 2.0解析器;在AllCops下使用TargetRubyVersion参数配置)NUMS
=(*(2..9)).冻结
                         ^


试着

NUMS = [1, 2, 3, 4, 5, 6, 7, 8, 9].freeze
Run Code Online (Sandbox Code Playgroud)

Rubocop说

== happy_robot_dance(没有错误)

我说

键入1,2,3,... 9,我的手会受伤

有没有办法使用splat分配和冻结常量?

----------

解决方案

NUMS = (2..9).to_a.freeze

NUMS = Array(2..9).freeze
Run Code Online (Sandbox Code Playgroud)

Dre*_*nmi 5

这个案子以前是由RuboCop解释的(阅读bug.)

我添加了一个问题拉取请求来解决这个问题.

与此同时,您可以通过以下方式禁用警察:

# rubocop:disable Style/MutableConstant
NUMS = *(2..9)
# rubocop:enable Style/MutableConstant
Run Code Online (Sandbox Code Playgroud)

或者您可以使用#to_a:

NUMS = (2..9).to_a.freeze
Run Code Online (Sandbox Code Playgroud)


Owe*_*wen 0

我认为这是为了安抚 Rubocop 本身而进行的案例 - 案例 2 看起来应该可行,因此可以被视为一个错误。然而,这有效吗?

why_do_i_exist = *(2..9)
NUMS = why_do_i_exist.freeze
Run Code Online (Sandbox Code Playgroud)