2010-09-14 2 views
2

J'ai ce codeLire depuis stdin ou un fichier dans stagment unique en Ruby

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 

Mais je ne veux pas de code répété pour stdin et le fichier, comment puis-je réécrire?

Répondre

4

Vous pouvez extraire votre code répété dans une méthode et l'appeler sur ARGF ou file car ils répondent aux mêmes méthodes.

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 

Ensuite, votre exemple devient:

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 

Je l'ai utilisé do ... end plutôt que {} simplement parce que je trouve qu'il est plus facile à lire.

Questions connexes