Как решить Rubocop response_to_missing? оскорбление

Рубокоп дает мне следующую обиду

lib/daru/vector.rb:1182:5: C: Style/MethodMissing: When using method_missing, define respond_to_missing? and fall back on super.
    def method_missing(name, *args, &block) ...
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Отсутствующий метод определяется как:

def method_missing(name, *args, &block)
  if name =~ /(.+)\=/
    self[$1.to_sym] = args[0]
  elsif has_index?(name)
    self[name]
  else
    super(name, *args, &block)
  end
end

Я попытался исправить это с помощью приведенного ниже кода, увидев пример из здесь

def respond_to_missing?(method_name, include_private=false)
  (name =~ /(.+)\=/) || has_index?(name) || super
end

Но теперь Рубокоп дает мне следующую обиду:

lib/daru/vector.rb:1182:5: C: Style/MethodMissing: When using method_missing, fall back on super.
    def method_missing(name, *args, &block) ...
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Я не могу понять, что не так. Как видите, я возвращаюсь к super в блоке else.


person Lokesh    schedule 27.07.2016    source источник
comment
Ставьте комментарии # rubocop:disable Style/MethodMissing перед строкой с оскорблением и # rubocop:enable Style/MethodMissing сразу после. Рубокоп всего лишь полицейский, и он может ошибаться.   -  person Aleksei Matiushkin    schedule 27.07.2016
comment
Кстати: если вы просто хотите передать те же аргументы, которые вы получили, вы можете просто вызвать super без списка аргументов. Это не имеет никакого отношения к вашей проблеме, которая, по-видимому, заключается в том, что Rubocop просто не в состоянии увидеть, что есть путь, который ведет к вызову super (помните, статический анализ почти всего, даже отдаленно интересного, эквивалентен решению проблемы остановки). Проблема, и Ruby не совсем предназначен для легкого статического анализа, к тому же). Или, может быть, он действительно затыкает его.   -  person Jörg W Mittag    schedule 27.07.2016


Ответы (2)


Rubocop ожидает, что super будет вызываться без аргументов. Поскольку аргументы, которые вы передаете super, такие же, как и полученные, вы можете просто удалить аргументы:

def method_missing(name, *args, &block)
  if name =~ /(.+)\=/
    self[$1.to_sym] = args[0]
  elsif has_index?(name)
    self[name]
  else
    super
  end
end
person Justin Ko    schedule 27.07.2016
comment
Спасибо, что принял участие в этом @Justin. Думаю, вы могли опознать еще одного пропавшего копа. :-) Что-то вроде Lint/UselessSuperArguments. - person Drenmi; 01.08.2016

Может быть, вам стоит попробовать def respond_to_missing?(name, include_private=false) вместо этого?

person Mobile Perpetuum    schedule 16.07.2018