はじめに
この記事のコメントで@kts_h さんに教えていただいたdefine_method
をVSCode
で理解する。
define_method
def my_decorator(meth)
orig = method(meth)
define_method(meth) do |*args, **kwargs, &block|
puts "Calling decorated method"
orig.call(*args, **kwargs, &block)
end
end
def example
puts "Called decorated method"
end
my_decorator(:example)
example
何やら難しそう。
でも大丈夫、VSCodeならね。
VSCode でのデバッグ
手前味噌ながら、こちらの記事を参照願います。
F5
まずは、F5
を押下。
"stopOnEntry": true
なので、ここで止まります。
次に、F11
を押下(以下、F11
の押下を繰り返します)
Ruby
の中の人として、どういうメソッドが定義してあるか確認していると思われ。
my_decorator
にシンボルexample
を引数として渡します。
my_decoratorメソッドの1行目に行きます。
ここがポイントですが、先程メソッドの確認をしたようにdefine_method
で再定義されたmeth = exampleを確認するにとどめます。
よって、puts "Calling decorated method"
は呼び出されずに次の行である15行目に行きexample
が呼び出されます。
example
はdefine_method
で再定義されていますので、そこの1行目に行き、puts "Calling decorated method"
が実行されます。
次は、再定義前のもとのメソッドを呼び出します。
もとのメソッドにあるputs "Called decorated method"
が呼び出されてプログラムは終了します。
何となく理解した気がします。
メモ
- Ruby の define_method を学習した
- 道のりは遠そう