Ruby Gold受験のヒント
数週間すると、次のような認定証が郵送されてきました。

合格に苦労した分、本当に嬉しいです。
最終的に、Ruby技術者認定試験Goldを取得するのに、3回受験をすることになりました。
そもそも、その原因のひとつはクラス継承時のメソッド探索の動きについての理解が曖昧だったことにあります。
特に、メソッドが存在しなかった時に、呼び出されるmethod_missing()との関係が曖昧でした。
更に、定数が存在しない場合の動作とconst_missing()の関係については、実際に試験でも出題されたのですが、全く理解できず手が出ませんでした。
この内容はとても重要だと思いますので、自作問題を3つ紹介します。
理解しておけば、きっと試験にも役立つと思いますので、Gold受験を目指す方は、是非一度チャレンジしてみてください。
一つ目は、インスタンスメソッドが見つからない場合の動きです。
【問題1】次のプログラムを実行した場合、何が出力されるか。
二つ目は、クラスメソッドが見つからない場合の動きです。
【問題3】次のプログラムを実行した場合、何が出力されるか。
三つ目は、定数が未定義であった場合の動きです。
【問題3】次のプログラムを実行した場合、何が出力されるか。
正解はこちらです。
【問題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%が金額アップ↑↑【エンジニアナビ】

合格に苦労した分、本当に嬉しいです。
最終的に、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に詳しく説明が載っていますので一読して正しく理解しておくことをおすすめします。
開発者のためのホスティングサービス



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