英語の授業でmoodle言うCMSを使っている。主にReadingの練習用です。
“many many many many write!”なんて言ってますけど読むことも大切ですねって。
読み物が置いてあって読むわけですが、まぁいままで読んでたのはまぁまぁ簡単だったのよね。
読んでそれについてのQUIZに答えると。まぁ大体70%ぐらいは正解しますね。ほとんど正解なんてときもある。
宿題で今学期の目標分進めておきましょうとか書いてあったので家からやってたんですが、
その読み物を読み終わったら”TOEFL”と書いてあって、TOEFLの何だろうと思ったらTOEFLの問題文だった。
そしてQUIZはTOEFLの問題。やったが難しい。1回目の正解率40%でこのQUIZの合格ラインの60%越えないわ。
その問題だが、この文章にはなんて言う題名が合いますか?とか、ここから類推できるのはどれですかとか。
これ国語のテストみたいですね。事実英語圏の人が受けても4択なのに中ぐらいの点数しか取れないんだと。
ちなみにTOEFLは大学の留学のための英語力をチェックするための試験です。
そこでensureとかなんとか書いてあって調べたら「確実にする」とかいう意味だった。
なんかで見た言葉だなと思ったらRubyの例外処理用のキーワードですわ。
普通例外処理用のキーワードというと try~catch~finallyですよね。
C#の場合このように書きます。
try{
System.IO.StreamReader sr=new System.IO.StreamReader("foobar.txt");
try{
data=sr.ReadToEnd();
}finally{
sr.Close();
}
}catch(System.Exception e){
System.Console.WriteLine("Catch! {0}",e);
}
tryしてcatchでその例外をキャッチすると。
ここではSystem.Exceptionでキャッチしてるが、System.IO.IOExceptionとかでキャッチするとそれ以外は無視する。
catchは何個も連ねて書いていいのでこのときはこうという風に条件分岐ができる。
finallyは必ずストリームを閉じるとかそういうことを忘れないようにという使います。
ただしC#の場合はusing構文を使うのが普通ですが。
using(System.IO.StreamReader sr=new System.IO.StreamReader("foobar.txt")){
data=sr.ReadToEnd();
}
IDisposableを実装したオブジェクトなら自動的に破棄できると。
usingを使う癖を付けておきましょうとよく言われます。
しかしRubyは違う。
begin
fh=File.open('foobar.txt')
begin
fh.each do |line|
print line
end
ensure
fh.close
end
rescue => e
p e
end
Rubyではbegin~rescue~else~ensure~endという構文を使います。
まつもとさん曰く、試してして失敗をキャッチするというよりかはなんかあったときレスキューに行くというほうがいいよね。
とどこかに書いてあったような気がするんだがなぁ……
まぁいいや、とりあえずキーワードが違うんです。
beginから始まることについて、例外がraise(throwではない)されればrescueに行き、何もなければelseに行く。
そしてどちらにせよ最後はensureに行くという構造をしている。
rescueでは rescure => eと例外について受け取る変数を指定したり、 rescue Errno::ENOENT のように例外を限ることもできる。
上の例ではelseは使っていない。
もっとも上の例について言えば、入れ子になってる begin~ensure~endは、
File.open do |fh|
fh.each{ |line| print line }
end
のようにFile.openをブロック付きメソッド呼び出しすればいいんですけどね。
このRubyのそれの言葉の意味を考えると、
rescue : 例外来たら駆けつけるよ
else : 例外なく終えてしまったなら……
ensure : ここにあることは確実に実行されます
という風な意味でしょう。ここにあるelseってのはしっくりきませんけどね。
rescueで楽しいことはretryっていうのがあるんですね。これしたらbeginからやり直すことができる。
自転車がパンクしたってrescueに応急修理すればretryすればいいじゃない。
そして家に着いたらensureで確実に点検しましょうよ。なかなか自然だと思います。
いいキーワードだと思います。
が……問題は\try~catch~finallyというキーワードがあまりに有名なので混乱せんかということだ。
あとthrowがraiseだったり。厄介なのはthrowに別の意味あったりする。
同じようなことはPerlにも言えますけどね。Cで言うところのbreak,continueがlast,nextだったり。
Rubyでもnextは使われていますね。
まぁ慣れてしまえばそっちのほうがいいのかもしれんが、慣れるまでは大変そうです。