はじめに
この記事のコメントで@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 を学習した
- 道のりは遠そう