从stdin或文件中读取红宝石中的单个停顿

时间:2010-09-14 09:20:23

标签: ruby file-io

我有这段代码

if filename
  begin
    if filename == '-'
      ARGF.each{|url|
        begin
          check(url)
        rescue Timeout::Error, Errno::ETIMEDOUT
          puts "Timeout Error, try again"
          redo
        end
      }
    else
      File.open(filename) {|file|
        file.each{|url|
          begin
            check(url)
          rescue Timeout::Error, Errno::ETIMEDOUT
            puts "Timeout Error, try again"
            redo
          end
        }
      }
    end
  rescue Interrupt, Errno::EINTR
    exit(1)
  end
end

但是我不想重复stdin和文件的代码,我怎么能重写呢?

2 个答案:

答案 0 :(得分:4)

您可以将重复的代码提取到方法中,然后在ARGFfile上调用,因为它们会响应相同的方法。

def do_check(to_check)
  to_check.each do |url|
    begin
      check(url)
    rescue Timeout::Error, Errno::ETIMEDOUT
      puts "Timeout Error, try again"
      redo
    end
  end
end

然后你的例子变成:

if filename
  begin
    if filename == '-'
      do_check(ARGF)    
    else
      File.open(filename) do |file|
        do_check(file)
      end
    end
  rescue Interrupt, Errno::EINTR
    exit(1)
  end
end

我使用do ... end而不是{}只是因为我觉得它更容易阅读。

答案 1 :(得分:2)

尝试使用$<特殊变量:http://ruby.wikia.com/wiki/Special_variable