Оператор 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
директивы. (Это может или не может быть осуществимо, в зависимости от количества правонарушений.) - Отключите этого полицейского, пока проблема не будет решена.