如Rubocop所述如何将&:read作为参数传递给File.open

时间:2019-01-03 03:24:57

标签: ruby rubocop

我有这个代码

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

但Rubocop警告:

  

罪行:

     

Style / SymbolProc :将&:read作为参数传递给open而不是   

您如何做到的?

3 个答案:

答案 0 :(得分:5)

我刚刚创建了一个名为“ 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)作为最后一个参数。

答案 1 :(得分:3)

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

Rubocop希望您使用Ruby中的'symbol to proc'功能而不是定义一个完整的块。这纯粹是风格,并不影响代码执行。您可以在Rubocop style guide中找到它。

答案 2 :(得分:1)

您可以在RuboCop的文档中查找攻击,例如Style/SymbolProc –通常显示一个“坏”和“好”的例子:

# 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)