我有这个代码
File.open(file_name, 'r') { |file| file.read }
但Rubocop警告:
罪行:
Style / SymbolProc :将
&:read
作为参数传递给open
而不是
您如何做到的?
答案 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)