ruby - 提前退出的文件读取循环

标签 ruby loops file-io

我必须用 Ruby 处理一些笨重的文件。给定一个特定的 ID,我知道与该 ID 关联的数据将在 不超过一个 文件中,但我不确定是哪个文件。它也可能不存在,这是我需要处理的错误状态。所以我有一个这样的循环:

files = ['a','b','c','d']
files.each do |filename|
  File.open(filename,'r') do |f|
    break unless contains_id(myid)
    do_stuff
  end
end

所以我有两个问题:

  1. 一旦找到包含我要查找的数据的文件,跳出循环的正确方法是什么?

  2. 如何处理数据不在任何文件中的情况?

这是我想出来的,但感觉很粗糙:

files = ['a','b','c','d']
found = false
files.each do |filename|
  break if found
  File.open(filename,'r') do |f|
    break unless contains_id(myid)
    found = true
    do_stuff
  end
end
do_error_stuff unless found

最佳答案

您可以使用 Enumerable#find 而不是 #each 来查找 block 返回 true 的 files 中的第一个条目,否则。所以这看起来像:

files = ['a','b','c','d']
file = files.find do |filename|
  File.open(filename,'r') do |f|
    contains_id(myid)
  end
end
do_error_stuff unless file

关于ruby - 提前退出的文件读取循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608150/

相关文章:

ruby - 我安装 gsl(使用 netbeans)时出现错误

java - for循环中意外的绘制顺序

Java- main 中文本文件的相对路径?

C++ 和二进制文件 - 新手问题

javascript - 关于 'application.js'文件的一些问题

ruby - 在 factory_girl 中有没有办法获取 attributes_for 并为同一个实例元素创建?

ruby - 将引导字形添加到 Rails 中的按钮

loops - 如何将for循环转换为stream循环

javascript - 循环和数组问题

list - 将带有空格的文件行作为列表读入 NetLogo