スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



Ruby Gold受験のヒント

数週間すると、次のような認定証が郵送されてきました。

Ruby Gold認定証



合格に苦労した分、本当に嬉しいです。

最終的に、Ruby技術者認定試験Goldを取得するのに、3回受験をすることになりました。

そもそも、その原因のひとつはクラス継承時のメソッド探索の動きについての理解が曖昧だったことにあります。
特に、メソッドが存在しなかった時に、呼び出されるmethod_missing()との関係が曖昧でした。

更に、定数が存在しない場合の動作とconst_missing()の関係については、実際に試験でも出題されたのですが、全く理解できず手が出ませんでした。

この内容はとても重要だと思いますので、自作問題を3つ紹介します。
理解しておけば、きっと試験にも役立つと思いますので、Gold受験を目指す方は、是非一度チャレンジしてみてください。

一つ目は、インスタンスメソッドが見つからない場合の動きです。

【問題1】次のプログラムを実行した場合、何が出力されるか。

module M
def method_missing(id, *args)
puts "M#method_missing()"
end
end

class A
include M
def method_missing(id, *args)
puts "A#method_missing()"
end
end

class B < A
def method_x
puts "#{self.class.name}:method_x"
end
class << self
def method_missing(id, *args)
puts "B`method_missing()"
end
end
end

obj = B.new
obj.method_x
obj.method_y


二つ目は、クラスメソッドが見つからない場合の動きです。

【問題3】次のプログラムを実行した場合、何が出力されるか。

class Module
def method_missing(id, *args)
puts "Module#method_missing()"
end
end

class Class
def method_missing(id, *args)
puts "Class#method_missing()"
end
end

module M
def method_missing(id, *args)
puts "M#method_missing()"
end
end

class A
include M
def method_missing(id, *args)
puts "A#method_missing()"
end
end

class B < A
def self.method_x
puts "#{self}.method_x"
end
def method_missing(id, *args)
puts "B#method_missing()"
end
end

B.method_x
B.method_y


三つ目は、定数が未定義であった場合の動きです。

【問題3】次のプログラムを実行した場合、何が出力されるか。

class Module
def const_missing(id)
puts "Module#const_missing()"
id = 1
end
end

class Class
def const_missing(id)
puts "Class#const_missing()"
id = 2
end
end

class Object
def const_missing(id)
puts "Object#const_missing()"
id = 3
end
end

class A
def const_missing(id)
puts "A#const_missing()"
id = 4
end
end

class B < A
CNST_X = "123"

def method01
puts "CNST_X=#{CNST_X}"
puts "CNST_Y=#{CNST_Y}"
end

def const_missing(id)
puts "B#const_missing()"
id = 5
end
end

obj = B.new
obj.method01






正解はこちらです。
【問題1】
B:method_x
A#method_missing()

インスタンスメソッド探索経路に、該当メソッドが見つからなかった場合は、同じ経路でmethod_missing()を探索して呼び出します。

【問題2】
B.method_x
Class#method_missing()

Objectクラスまでのクラスメソッド探索経路後は、Class、Module、Object、Kernelのインスタンスメソッドを探索します。
該当メソッドが見つからなかった場合は、同じ経路で、method_missing()を探索して呼び出します。

【問題3】
CNST_X=123
Class#const_missing()
CNST_Y=2

定数が見つからない場合、スーパークラスを探します。
それでも見つからなかった場合は、クラスメソッドの探索経路でconst_missing()を探索して呼び出します。





正しく解答できたでしょうか。
正しく解答できなかった方は、不合格時の私と同じレベルである可能性があります。


Ruby技術者認定試験Goldの学習方法で紹介したプログラミング言語Rubyに詳しく説明が載っていますので一読して正しく理解しておくことをおすすめします。


開発者のためのホスティングサービススケール
UQ WiMAX × BIGLOBE
フリーエンジニア79.6%が金額アップ↑↑【エンジニアナビ】

関連記事
スポンサーサイト



コメントの投稿

非公開コメント

プロフィール

Kamui Kentaro

Author:Kamui Kentaro
プロフィール詳細はコチラです。

メール
最新記事
カテゴリ
全記事表示リンク

全ての記事を表示する

月別アーカイブ
リンク
※相互リンク募集中!
ブログランキング
クリック、更新の励みになります

FC2Blog Ranking

最新コメント
最新トラックバック
FC2カウンター
あし@
検索フォーム
RSSリンクの表示
QRコード
QR
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。