我有这段代码
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和文件的代码,我怎么能重写呢?
答案 0 :(得分:4)
您可以将重复的代码提取到方法中,然后在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
而不是{}
只是因为我觉得它更容易阅读。
答案 1 :(得分:2)
尝试使用$<
特殊变量:http://ruby.wikia.com/wiki/Special_variable