M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Ruby Association Certified Ruby Programmer Silver になった

Ruby言語のお勉強のみちしるべにRubyアソシエーションの試験を受けました。

Silverの試験内容としては、基本的な構文と組み込みクラスとモジュールのAPIについての知識があれば、十分というもの。
ポリモーフィズムやMix-in、引数の展開/集約、yield関連の知識は不要でした(たまたま問題に出なかっただけかも知れない)。

なので以前の投稿であげた『公式ガイド』の知識だけで十分です。
補足的知識として、リファレンス・マニュアル(いわゆる「るりま」)の「組み込みライブラリ」の章で、Integer、Float、String、Regex、Array、Hash、Timeといった『公式ガイド』でも解説されているクラスのメソッドを確認して、破壊的/非破壊的の区別(接尾辞“!”はついていないが破壊的なものがとくに問題)や、これと絡んでIN/OUTの対応も見ておくとよいかも知れません。

ところでその『公式ガイド』ですが、こちらのページでまず正誤を確認した方がいいです。

また上記ページには載っていませんが、86ページ目のメソッドのアクセス制御の解説箇所で、protectedと指定されたメソッドは、「同一クラスまたはサブクラスのインスタンスがselfである場合のみ呼び出せる」とあるのですが、これは厳密に間違いとは言わないまでも説明が下手で*1、事実は「別インスタンスであっても同一クラスまたはサブクラスであれば呼び出すことができる(メソッド)」です。

この点『プログラミングRuby』の記述は明快で、「定義元クラスおよびそのサブクラスのすべてインスタンスから呼び出すことができます」(37ペ)、「protectedは、オブジェクトが同じクラスの別のオブジェクトの内部状態にアクセスする必要があるときに使います」(39ペ)ということです。

ちなみにRubyにおけるprivateメソッドは、Javaにおけるprotectedメソッドに対応します。もっともJavaでは同一パッケージであればアクセスが許されますが、Rubyではこれは許されません。Rubyにおいてはprivateメソッドはレシーバなしでしか呼ぶことができません。privateメソッドはメンバとしてサブクラスへも継承されるので(ここもJavaとの違いの1つですが)、サブクラスのインスタンスはそれを自分自身のprivateメソッドとして、レシーバなしで呼び出すことができます*2
もっともこのアクセス制御のトピックも、今回の試験には登場しませんでした。

Ruby技術者認定試験 公式ガイド (ITpro BOOKs)

Ruby技術者認定試験 公式ガイド (ITpro BOOKs)

*1:たしかにprotectedメソッドを呼び出せるのは、「同一クラスまたはサブクラスのインスタンスがselfである場合」なのですが、本来ここで説明すべきなのは、「そのような状況下で、自他を問わず、同一クラスまたはサブクラスのすべてのインスタンスのメソッドにアクセスできる」ということなのです。

*2:2011年11月3日追記