рубокоп обида но не уверен что не так

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

  total_cost = tmp_totals.inject { |total, tmp_val| total + tmp_val }

я получаю эту ошибку

app/models/item_count.rb:58:40: C: Name inject block params |acc, elem|

это выглядит так:

введите здесь описание изображения

Я просто пытаюсь пройти мимо этого копа. Любые идеи, что он говорит мне исправить?


person timpone    schedule 31.12.2016    source источник
comment
Почему бы не заменить всю строку на total_cost = tmp_totals.inject(:+) или total_cost = tmp_totals.sum? На самом деле не отвечает на вопрос, но рубукоп закроется, не совершая кучу бессмысленных искажений.   -  person mu is too short    schedule 01.01.2017
comment
Не забывайте при выполнении inject или reduce в списках иметь значение по умолчанию, которое будет обрабатывать условия пустого списка: например, inject(0) { ... }.   -  person tadman    schedule 01.01.2017


Ответы (2)


По умолчанию Rubocop хочет, чтобы вы назвали эти две переменные acc и elem вместо total и tmp_val. Вы можете настроить нужные переменные в своем собственном rubycop.yml. По умолчанию настроено так:

Style/SingleLineBlockParams:
  Methods:
    - reduce:
        - acc
        - elem
    - inject:
        - acc
        - elem
person infused    schedule 31.12.2016
comment
Почему это улучшит качество кода? Я думаю, что total_cost = totals.inject { |sum, total| sum + total } читается лучше, чем total_cost = totals.inject { | acc, elem | acc + elem }. - person Smek; 13.04.2017

Рубокоп слишком строг с этим. Следует просто проверить, что второй параметр не называется mem или acc ИМХО. Просто используйте:

total_cost = tmp_totals.inject(0) { |acc, elem| acc + elem }

Or

total_cost = tmp_totals.inject(0, :+)

Rubocop не будет жаловаться, и вы получите 0 вместо nil для пустого массива.

Если вы не уверены, на что жалуется rubocop, вы можете:

  • убедитесь, что ваш код зафиксирован

  • использовать rubocop -a script.rb

  • проверить, работает ли код

  • проверь в чем разница

person Eric Duminil    schedule 01.01.2017
comment
AFAIK tmp_totals.inject(0, :+) тоже будет работать и будет быстрее, чем &:+ - person Hauleth; 01.01.2017