如何按照 Rubocop 的指示将 &:read 作为参数传递给 File.open

How to pass &:read as argument to File.open as indicated by Rubocop

我有这个代码

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

但 Rubocop 发出警告:

Offenses:

Style/SymbolProc: Pass &:read as argument to open instead of a block.

你是怎么做到的?

我刚刚创建了一个名为 "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" 

换句话说,包括过程(例如,&:read)作为最后一个参数。

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

Rubocop 希望您使用 'symbol to proc' feature in Ruby instead of defining a complete block. This is purely stylistic, and doesn't affect the code execution. You can find it in the Rubocop style guide

你可以在 RuboCop 的文档中查找攻击,例如Style/SymbolProc – 它通常显示一个 "bad" 和一个 "good" 例如:

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

# good
something.map(&:upcase)

如果这没有帮助,您可以让 RuboCop auto-correct 进攻(对于像这样支持自动更正的警察)。

给定一个文件 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)