Как передать &: читать как аргумент для File.open, как указано Rubocop - PullRequest
0 голосов
/ 03 января 2019

У меня есть этот код

File.open(file_name, 'r') { |file| file.read }

, но Рубокоп предупреждает:

Нарушения:

Style / SymbolProc: передать &:read в качестве аргумента open вместо блока.

Как это сделать?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

File.open(file_name, 'r', &:read)

Rubocop хочет, чтобы вы использовали символ 'для показа' в Ruby вместо определения полного блока. Это чисто стилистически и не влияет на выполнение кода. Вы можете найти его в Руководстве по стилю Rubocop .

0 голосов
/ 03 января 2019

Вы можете найти нарушение в документах RuboCop, например, Style / SymbolProc - обычно показывает «плохой» и «хороший» пример:

# bad
something.map { |s| s.upcase }

# good
something.map(&:upcase)

Если это не поможет, вы можете иметь RuboCop с автокоррекцией нападение (для полицейских, поддерживающих автокоррекцию, подобных этой).

Данный файл test.rb:

# frozen_string_literal: true

File.open(file_name, 'r') { |file| file.read }

Выполнить rubocop -a: (фактический вывод зависит от вашей конфигурации)

$ rubocop -a test.rb
Inspecting 1 file
C

Offenses:

test.rb:3:27: C: [Corrected] Style/SymbolProc: Pass &:read as an argument to open instead of a block.
File.open(file_name, 'r') { |file| file.read }
                          ^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected, 1 offense corrected

И test.rb станет:

# frozen_string_literal: true

File.open(file_name, 'r', &:read)
0 голосов
/ 03 января 2019

Я только что создал файл с именем "t.txt", который содержит "Hello, World \ n".Мы можем прочитать это следующим образом.

File.open('t.txt', 'r', &:read)
  #=> "Hello, World\n"

Кстати, по умолчанию второй аргумент равен 'r', достаточно написать:

File.open('t.txt', &:read)

Вот еще один пример:

"This is A Test".gsub('i', &:upcase)
  #=> "ThIs Is A Test" 

Другими словами, включите proc (например, &:read) в качестве последнего аргумента.

...