如何突破ruby变量的作用域



我使用了以下代码从文件中删除行:

File.open("#{$whitelist}-tmp", "w") do |outFile|
  File.foreach("#{$whitelist}") do |li|
    outFile.puts li unless li.chomp[/A#{instanceId}z/]
    @comm = outFile
  end
end
FileUtils.mv(@comm, $whitelist)

它工作,但我认为这不是正确的方式去做,因为我不得不创建一个额外的变量'@comm'只是为了从循环中传达文件名。如果我使用'outFile'作为FileUtils的第一个参数。我直接得到一个未定义变量错误。

那么,我应该怎么做呢?

Doc on File.open

如果给出了可选代码块,它将作为参数传递打开的文件,并且当代码块终止时,file对象将自动关闭。 block的值将从File.open返回

所以我们可以这样做

file = File.open("#{$whitelist}-tmp", "w") do |outFile|
  File.foreach("#{$whitelist}") do |li|
    outFile.puts li unless li.chomp[/A#{instanceId}z/]
  end
  outFile # return value of the block
end
FileUtils.mv(file, $whitelist)

更新

我错过了什么或这段代码只是过滤和重写文件?如果是这样,可以简化得多。

filename = $whitelist
content = File.readlines(filename)
filtered = content.grep(/A#{instanceId}Z/)
File.write(filename, filtered)

最简单的方法是在使用它的块之前分配一个包含文件名的变量:

tempFile = "#{$whitelist}-tmp"
File.open(tempFile, "w") do |outFile|
  File.foreach("#{$whitelist}") do |li|
    outFile.puts li unless li.chomp[/A#{instanceId}z/
  end
end
FileUtils.mv(tempFile, $whitelist)

最新更新