Rubyその2
『たのしいRuby第2版』をちまちまと読んでいるのですが、今日やっとこさ第2部まで読み終わりました。そこまでで、Javaと違ったりしていていまいちピンとこないなぁという概念が2つありました。
- モジュール
- 例外処理・・・というか、catch throw文
です。
モジュールって、
- インスタンスをもてない
- 継承できない
という点でクラスと異なるとのこと。一瞬javaのインタフェースみたいなものかな?とも思ったのですが・・・違うか・・・いや、よく考えるとやっぱりそうかな?
■インタフェースと似てるところ
Javaってインタフェースを継承できなかったっけ?あ、あれは継承(extends)じゃなくて、実装(implements)だ。RubyだとMix-inってのがあるから、これがimplementsに相当するのかな。そういう意味では似てる。
■インタフェースと違うところ
Javaのインタフェース自身はメソッドの中身を定義できなくて、実装するクラス側に定義を強制する仕組みだけど、Rubyのモジュールではモジュール自身で、メソッドを定義しちゃうのね。
Javaのインタフェースという機構が分りにくい概念(『メソッドの実装を強制するって何か役に立つの?』)だったので、単純にメソッドを束にして定義しておいて、気楽にMix-Inして便利に使える機構にしたって事かなぁ。
一方、例外処理はJavaとはキーワードが違ってますね。try catch finallyの代わりに、begin rescue ensure endを使うのね。紛らわしいことに、catchとthrowってキーワードがあって、それは例外とは関係ないようです(関係ないにもかかわらず、例外処理の節に説明があってさらにややこしい!)。『catch throwの使い方がいまいち分らないなぁ。breakじゃだめなのかなぁ。。』と思ってちょっと調べてみたら、goto文とかレベル指定のbreakとして使えるのね。って例外処理とぜんぜん関係ないじゃん!『たのしいRuby第2版』9.11節には、『例外ではありませんが、』とさらっと書いてありますが、より明確に、『Javaでは例外処理はtry catch節が使われ、例外を投げるのにはthrow文が使われます。Rubyにも似たようなcatchやthrowというメソッドがありますが、これは実行の制御に使われるのであり、例外処理とは関係ないので気をつけてください。』という文章を入れておくべきだと思いました。さらにいえば、catch throwの話はこの例外処理の章からはずして、脚注で触れる程度にしておけばさらに良いと思います。そうすれば、Javaから入る人は『あぁRubyだと例外処理はtry catchじゃないのね』と思いますし、Rubyから入る人は、そもそも例外処理について学ぶときcatch throwについて知る必要はないのですから。制御文の項目に入れる(学ぶ)べき内容だと思います。
| 固定リンク
この記事へのコメントは終了しました。


コメント