Чтение из стандартного ввода или файла в одном сегменте в рубине - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть этот код

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

Но я не хочу повторного кода для стандартного ввода и файла, как я могу переписать его?

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Вы можете извлечь свой повторный код в метод и вызвать его на ARGF или file, когда они отвечают на те же методы.

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 вместо {} просто потому, что мне легче читать.

2 голосов
/ 22 октября 2012

Попробуйте использовать $< специальную переменную: http://ruby.wikia.com/wiki/Special_variable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...