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 Error
はName 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
状態で死んでいないため、引き続きこのスレッドのためにプログラムは終了しない。