Оператор Splat (*) с константой и attr_reader с rubocop

Я получаю неоднозначную ошибку оператора splat при попытке назначить атрибут чтения с помощью константы класса.

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

Тем не менее, я попробовал несколько обходных путей, которые все еще приводят к нарушению правил синтаксиса. Вот несколько из попробованных подходов:

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


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

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

Я согласен, что такая конструкция, как:

attr_reader *FOO

не следует считать неоднозначным, потому что возвращение attr_reader происходит в пустом контексте, и, таким образом, выполнение умножения было бы бессмысленным и, вероятно, ошибкой.

Кроме того, идиоматический Ruby требует, чтобы макро методы вызывались без круглых скобок, а необходимость добавления скобок в некоторых случаях противоречит этому соглашению.

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


На данный момент у вас есть несколько вариантов, чтобы обойти это:

  • Используйте скобки для макрос-методов с аргументами splat.
  • Инлайн отключить полицейского для каждого случая этого преступления, используя rubocop:disable директивы. (Это может или не может быть осуществимо, в зависимости от количества правонарушений.)
  • Отключите этого полицейского, пока проблема не будет решена.
Другие вопросы по тегам