2013-03-25 81 views
1

我必须处理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 

回答

3

可以使用Enumerable#find代替#each找到files中的第一项,该块返回true,否则nil 。所以这看起来像:

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