Rubyで、複数(任意個)のファイルを同時にオープンして処理しています。具体的にはHTTP POSTをしています。
とりあえず次のような感じで書いて、ファイルをオープンしてできたIOのArrayを作って処理しています。
ruby:
1filenames = ['foo.tar.xz', 'bar.zip'] 2 3begin 4 inputs = [] 5 filenames.each do |f| 6 inputs << open(f) 7 end 8 9 # ここにinputsを使った処理入る 10 11rescue => ex 12ensure 13 inputs.each {|x| x.close } 14 raise ex if ex 15end
ここで、filenames.each do 〜
の部分は、[String] -> [IO]
という処理なので、mapを使ったほうが自然かなと思っています。
ruby:
1 inputs = filenames.map {|f| open(f) }
しかし、mapにした場合は、途中で例外(たとえばErrno::ENOENT)が起きると、inputsが結果のArrayをまだ指していないため、それまでにオープンしたIOをensureでクローズするという切り戻し処理ができません。
mapを使いつつ、例外が起きたときに そこまでの結果を切り戻す (実行前の状態に戻す)方法はないでしょうか。
なお、自然な記述が目的なので、複雑な方法は望むものではありません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/15 11:17