LoginSignup
0
0

More than 1 year has passed since last update.

VSCode で学ぶ define_method

Posted at

はじめに

この記事のコメントで@kts_h さんに教えていただいたdefine_methodVSCodeで理解する。

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を押下。
20211217a.png
"stopOnEntry": trueなので、ここで止まります。
次に、F11を押下(以下、F11の押下を繰り返します)
20211217b.png
Rubyの中の人として、どういうメソッドが定義してあるか確認していると思われ。
20211217c.png
my_decoratorにシンボルexampleを引数として渡します。
20211217d.png
my_decoratorメソッドの1行目に行きます。
20211217e.png
ここがポイントですが、先程メソッドの確認をしたようにdefine_methodで再定義されたmeth = exampleを確認するにとどめます。
20211217f.png
よって、puts "Calling decorated method"は呼び出されずに次の行である15行目に行きexampleが呼び出されます。
20211217g.png
exampledefine_methodで再定義されていますので、そこの1行目に行き、puts "Calling decorated method"が実行されます。
20211217h.png
次は、再定義前のもとのメソッドを呼び出します。
20211217i.png
もとのメソッドにあるputs "Called decorated method"が呼び出されてプログラムは終了します。

何となく理解した気がします。

メモ

  • Ruby の define_method を学習した
  • 道のりは遠そう
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0