Ruby rubocop: как заморозить константу массива, сгенерированную с помощью splat

Я назначаю константу массива следующим образом:

NUMS = *(2..9)

Рубокоп говорит

C: заморозить изменяемые объекты, назначенные константам.
NUMS = *(2..9)
^^^^^


Поэтому я пытаюсь

NUMS = *(2..9).freeze

Рубокоп говорит

C: заморозить изменяемые объекты, назначенные константам.
NUMS = *(2..9).freeze
^^^^^^^^^^^^^


Пытался

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

Рубокоп говорит

E: неожиданный токен tRPAREN (с использованием синтаксического анализатора Ruby 2.0; настроить с помощью параметра TargetRubyVersion в разделе AllCops)
NUMS = (*(2..9)).freeze
^


Пытался

NUMS = [1, 2, 3, 4, 5, 6, 7, 8, 9].freeze

Рубокоп говорит

== happy_robot_dance (без ошибок)

Я говорю

У меня болит рука от набора 1, 2, 3, ... 9

Есть ли способ использовать знак для назначения и замораживания константы?

----------

Решения

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

NUMS = Array(2..9).freeze

person Dirk Bruins    schedule 04.08.2016    source источник
comment
(2..9).to_a должно совпадать с [2,3,4, ...etc]. Интересно, вызывает ли проблема тот факт, что 2..9 является Range. В любом случае, если исходный код работает, предупреждение Rubocop выглядит необоснованным.   -  person max pleaner    schedule 04.08.2016
comment
Я согласен с тем, что нет причин использовать splat для приведения массива, когда #to_a доступен и намного понятнее. В то же время у этого копа не должно быть мнения по этому поводу.   -  person Drenmi    schedule 04.08.2016


Ответы (3)


Этот случай ранее не был учтен RuboCop (читай ошибка).

Я добавил проблему и pull request, который это исправит.

Тем временем вы можете заставить полицейского замолчать, отключив его для этого случая, используя:

# rubocop:disable Style/MutableConstant
NUMS = *(2..9)
# rubocop:enable Style/MutableConstant

Или вы можете использовать #to_a:

NUMS = (2..9).to_a.freeze
person Drenmi    schedule 04.08.2016
comment
NUMS = (2..9).to_a.freeze выглядит лучшим решением для ясности и рубокопа. ты, сэр - person Dirk Bruins; 04.08.2016
comment
Если вам нужна краткость, NUMS = [*2..9].freeze эквивалентно последнему решению в этом ответе. - person Lars Haugseth; 04.08.2016

Можешь попробовать:

NUMS = Array[*2..9].freeze

person Pete Wolfy Hanson    schedule 04.08.2016

Я думаю, что это случай умиротворения Rubocop ради самого себя - случай 2 выглядит так, как будто он должен работать, и поэтому его можно считать ошибкой. Однако работает ли это?

why_do_i_exist = *(2..9)
NUMS = why_do_i_exist.freeze
person Owen    schedule 04.08.2016
comment
Да, это работает. Но я до сих пор не знаю, почему_i_exists... ;-) - person Dirk Bruins; 04.08.2016