Ruby Gold模擬試験誤答一覧 その2

2週目なのに、なんだかんだ七問も間違えてしまって、なんだか雲行きが怪しくなってきた。

問6: Threadオブジェクトの新規作成

  • start
  • fork
  • new

が使える。再開は

  • run
  • wakeup

但し、wakeupとrunには仕様に多少の違いがあり、runが即座にそのスレッドの処理を開始するのに対いて、wakeupは停止スレッドを実行可能状態にするだけ。どういうとき実行できないのかはよくわからない。

問10: 例外クラスの継承関係

ちょっとした引っ掛け問題。でも本番でも引っ掛かりそう。

問題文のコードではNameErrorを捕捉するrescueが書かれているので、その節で再びraiseを起こすとNameErrorを発生させそうだが、raise自体が、一度起こった例外を再度発生させるものなので、既に発生している例外がNameErrorのサブクラスの例外であった場合、そのサブクラスの例外が再び発生する。

2行目で発生しているのは定義されていないメソッドに対するコールなので、No Method Errorが発生する。そしてNo Method ErrorName Errorの子クラスなので、rescue節で捕捉される。

問12: alias

これも(特に引っ掛け門題ではないけど)引っ掛かりそう。

問題のコードではold_methodという新しいメソッド名で呼び出したいので、alias old_method methodと呼び出すことになる。aliasはシンボルかリテラル表記で,で区切る必要がない点に注意。

問34: ancestors メソッド

ancestorsメソッドはselfがclassになるような時しか使えない。そしてメソッド内でのselfはメソッドを呼び出したオブジェクトになるのでNo Method Errorになる。

問39: RDoc

(あとで追記)

問50: Thread内での例外

Thread内で発生した例外については

その例外をrescue節で捕捉しなかった場合、そのスレッドのみが警告なしで数量する。 ただし、そのスレッドをjoinで待っている場合は待っているスレッドにも例外が再度発生する。

とされている。 問題のコードではトップクラスで実行されているスレッドがsleep状態で死んでいないため、引き続きこのスレッドのためにプログラムは終了しない。